2011-08-15 61 views
4

Spring有什么特别的方法来加载bean。加载Spring bean

我有一个appContext文件有很多的豆。 使用以下代码加载它时,它会再次加载所有的bean。

BeanFactory factory = new ClassPathXmlApplicationContext("appContext.xml"); 
+0

为什么要重新创建上下文? – beny23

+0

我在一个石英工作类中,需要一个bean对象,它调用一个dao类(应用程序在tomcat服务器上运行,这个类将每30分钟执行一次) – Joe

回答

4

什么?

豆映射

<bean id="springApplicationContext" class="SpringApplicationContext"/>

Java实现

public class SpringApplicationContext implements ApplicationContextAware { 

    private static ApplicationContext CONTEXT; 

    public void setApplicationContext(ApplicationContext ctx) throws BeansException { 
     CONTEXT = ctx; 
    } 

    public static Object getBean(String name) { 
     return CONTEXT.getBean(name); 
    } 
} 

然后使用它像这样;

SpringApplicationContext.getBean("myBean");

+0

如果您想从遗留代码(比如来自EJB层)调用Spring bean,这也很有用。 – atrain

2

默认情况下,spring会在启动时创建所有singleton放大的豆的实例。

我会建议你在几个不同的文件中拆分你的弹簧配置。在这种情况下,您将只能加载您的任务所需的那组bean。

另一种方法是用default-lazy-init属性来声明豆:关于使用ApplicationContextAware

<beans default-lazy-init="true"> 
    <!-- no beans will be pre-instantiated... --> 
</beans> 
+0

检索bean的代码是什么从这个XML。它会和我的问题一样吗?我只需要加载给定的bean。 – Joe

+0

@Joe:什么阻止你尝试?相同的代码仍然可以工作(类似于'beanFactory.getBean(name,clazz)') – Roman

0

可以使用了ApplicationContextAware接口。 example

当你得到这个bean的实例时,你可以加载你想要的任何bean。

0

一种方法是迁移到使用石英的泉水抽象。那样,你的石英“工作”从一开始就是春豆。

了解更多here

0

这可能有助于避免重新创建弹簧环境。

如果你使用Spring to configure the quartz job那么你可以直接从你的工作引用春豆。

例如,如果您使用MethodInvokingJobDetailFactoryBean,那么您可以创建一个执行代码的bean,然后调用您的DAO。

<bean id="exampleBusinessObject" class="my.pkg.BusinessObject"> 
    <property name="dao" ref="myDao" /> 
</bean> 

<bean id="exampleJob" 
     class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    <property name="targetObject" ref="exampleBusinessObject"/> 
    <property name="targetMethod" value="doIt"/> 
</bean> 

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="exampleJob" /> 
    <!-- run every 30 min --> 
    <property name="cronExpression" value="0 0/30 * * * ?" /> 
</bean> 
相关问题