如何找到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 IOC 源码简单分析 04 - bean的初始化
Spring注解驱动开发使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?