加载Spring bean

时间:2011-08-15 10:16:16

标签: java spring

Spring中有没有办法专门加载bean。

我有一个包含大量bean的appContext文件。 使用以下代码加载它时,它会再次加载所有bean。

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

5 个答案:

答案 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>