Spring有什么特别的方法来加载bean。加载Spring bean
我有一个appContext文件有很多的豆。 使用以下代码加载它时,它会再次加载所有的bean。
BeanFactory factory = new ClassPathXmlApplicationContext("appContext.xml");
Spring有什么特别的方法来加载bean。加载Spring bean
我有一个appContext文件有很多的豆。 使用以下代码加载它时,它会再次加载所有的bean。
BeanFactory factory = new ClassPathXmlApplicationContext("appContext.xml");
什么?
豆映射
<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");
如果您想从遗留代码(比如来自EJB层)调用Spring bean,这也很有用。 – atrain
默认情况下,spring会在启动时创建所有singleton
放大的豆的实例。
我会建议你在几个不同的文件中拆分你的弹簧配置。在这种情况下,您将只能加载您的任务所需的那组bean。
另一种方法是用default-lazy-init
属性来声明豆:关于使用ApplicationContextAware
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
可以使用了ApplicationContextAware接口。 example
当你得到这个bean的实例时,你可以加载你想要的任何bean。
一种方法是迁移到使用石英的泉水抽象。那样,你的石英“工作”从一开始就是春豆。
了解更多here。
这可能有助于避免重新创建弹簧环境。
如果你使用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>
为什么要重新创建上下文? – beny23
我在一个石英工作类中,需要一个bean对象,它调用一个dao类(应用程序在tomcat服务器上运行,这个类将每30分钟执行一次) – Joe