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