2011-08-15 100 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> 
相關問題