Spring中有没有办法专门加载bean。
我有一个包含大量bean的appContext文件。 使用以下代码加载它时,它会再次加载所有bean。
BeanFactory factory = new ClassPathXmlApplicationContext("appContext.xml");
答案 0 :(得分:6)
如何使用ApplicationContextAware
?
Bean映射
<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");
答案 1 :(得分:2)
默认情况下,spring会在启动时创建所有singleton
- 范围bean的实例。
我建议你将spring配置分成几个不同的文件。在这种情况下,您将只能加载任务所需的那组bean。
另一种方法是使用default-lazy-init
属性声明您的bean:
<beans default-lazy-init="true">
<!-- no beans will be pre-instantiated... -->
</beans>
答案 2 :(得分:0)
您可以使用ApplicationContextAware接口。 example
当你获得这个bean的实例时,你可以加载你想要的任何bean。
答案 3 :(得分:0)
一种方法是迁移到使用石英的弹簧抽象。这样,你的石英“工作”从一开始就是春天豆。
了解更多here。
答案 4 :(得分: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>