2011-08-15 11 views
4

SpringでBeanを具体的にロードする方法はありますか?Spring beanをロードする

私はたくさんの豆を持つappContextファイルを持っています。 次のコードを使用してロードすると、すべてのBeanが再度ロードされます。

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

なぜコンテキストを再作成しますか? – beny23

+0

私はquartzジョブクラスに属しており、そこにはdaoクラスを呼び出すBeanオブジェクトが必要です(アプリケーションはTomcatサーバーで実行され、このクラスは30分ごとに実行されます) – Joe

答えて

4

ApplicationContextAwareの使用について:

もう一つの方法は、default-lazy-init属性を使って豆を宣言するのですか?

豆マッピング

<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

デフォルトでは、起動時にすべてのsingletonスコープBeanのインスタンスが作成されます。

いくつかの異なるファイルでスプリング設定を分割することをお勧めします。その場合、タスクに必要なBeanのグループだけをロードすることができます。

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

Beanを取得するコードこのxmlから。それは私の質問で与えられたものと同じでしょうか?私は与えられたbeanだけをロードする必要があります。 – Joe

+0

@ジョー:あなたが何を試みるのを妨げるの? 'beanFactory.getBean(name、clazz)'のようなものです。 – Roman

0

あなたはApplicationContextAwareインタフェースを使用することができます。 example

このBeanのインスタンスを取得すると、必要なBeanをロードできます。

0

1つの方法は、石英のスプリング抽象化を使用する方法です。そうすれば、あなたの石英の "仕事"は最初から春の豆です。

続きを読む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> 
関連する問題