如何找到spring初始化的bean序列

Posted

技术标签:

【中文标题】如何找到spring初始化的bean序列【英文标题】:How to find the sequence of beans initialised by spring 【发布时间】:2016-12-17 08:03:08 【问题描述】:

我的 ApplicationContext 具有自动装配的 bean 以及在 application-Context.xml 文件中配置的 bean。我想知道spring初始化bean的顺序。

我想知道这个是因为: (我知道这是 stackoveflow 中一个已知且流行的问题..但无法找到解决方案!!) 我在 application-Context.xml 中创建了 SessionBean。现在尝试在 DaoImpl 文件中自动装配这个 bean。 sessionBean 在那里显示为空。可能是它的 sessionFactory 直到那时才初始化。

*我尝试使用 @DependsOn("SessionFactory") 失败。

所以我的问题是:

1)How to find the sequence of beans initialised by spring.
2)How do say to spring to initilise sessionfactory before  initialising my DAOImpl class.

请帮帮我!

提前致谢。

【问题讨论】:

bean 初始化的顺序不是问题的原因。 Spring 将确定自动装配是否需要 bean,并在之前初始化 bean。如果你有一个自动装配的字段,它是空的,你可能会自己创建一个类的对象,而不是 Spring。贴出你所涉及的一些代码。 【参考方案1】:

这是您第一个问题的答案-

<bean id="OutputHelper" class="com.mkyong.output.OutputHelper">
        <property name="outputGenerator" >
            <ref bean="CsvOutputGenerator"/>
        </property>
</bean>

<bean id="CsvOutputGenerator" class="com.mkyong.output.CsvOutputGenerator">
        <property name="name"value="hi"/ >
</bean>

say this is the bean defined in your spring config file 
so what spring container will try to do is -   
1. 1st it will try to load i.e `OutputHelper` class  
2. While loading the class it will check if there is any dependency                           
3. if yes,It will stop life cycle of main bean i.e `OutputHelper` and try to load dependent bean 'CsvOutputGenerator'.
- If current bean does not have any dependency then it will load the bean and moved back to main bean life cycle process.

step 2 &3 will be applicable for all the bean mentioned in config file.

【讨论】:

【参考方案2】:

Spring auto 通过查看该 bean 的所有依赖是否都已初始化来确定 Bean 初始化的顺序。

您的情况似乎您没有使用 DaoImpl 类的 spring 初始化 bean,而是自己创建了该类的新对象。

尝试创建 DaoImpl 类的 bean 并使用该 bean。

【讨论】:

以上是关于如何找到spring初始化的bean序列的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码解析之八finishBeanFactoryInitialization方法即初始化单例bean

Spring注解驱动开发如何使用@Bean注解指定初始化和销毁的方法?看这一篇就够了!!

spring 如何用注解的方式给普通类注入bean

Spring IOC----如何注册bean定义

Spring IOC 源码简单分析 04 - bean的初始化

Spring注解驱动开发使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?