目录
无依赖Bean创建和销毁的顺序
public class Bean1 {
Bean1(){
System.out.println("bean1 running...");
}
public void destroy(){
System.out.println("bean1 销毁");
}
}
public class Bean2 {
Bean2(){
System.out.println("bean2 running...");
}
public void destroy(){
System.out.println("bean2 销毁");
}
}
public class Bean3 {
Bean3(){
System.out.println("bean3 running...");
}
public void destroy(){
System.out.println("bean3 销毁");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bean1" class="com.example.Bean.Bean1" destroy-method="destroy"></bean>
<bean id="bean2" class="com.example.Bean.Bean2" destroy-method="destroy"></bean>
<bean id="bean3" class="com.example.Bean.Bean3" destroy-method="destroy"></bean>
</beans>
上面我们创建了三个对象bean1 bean2 bean3,并为其定义了destroy销毁方法。
当我们启动容器以后,控制台打印:
结论:在无依赖的情况下,bean创建的顺序由xml中bean的定义顺序决定,而销毁顺序恰好相反
通过构造器强依赖bean创建和销毁顺序
public class Bean1 {
Bean1(){
System.out.println("bean1 running...");
}
public void destroy(){
System.out.println("bean1 销毁");
}
}
public class Bean2 {
private Bean1 bean1;
Bean2(Bean1 bean1){
this.bean1=bean1;
System.out.println("bean2 running...");
}
public void destroy(){
System.out.println("bean2 销毁");
}
}
public class Bean3 {
private Bean2 bean2;
Bean3(Bean2 bean2){
this.bean2=bean2;
System.out.println("bean3 running...");
}
public void destroy(){
System.out.println("bean3 销毁");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bean3" class="com.example.Bean.Bean3" destroy-method="destroy">
<constructor-arg name="bean2" ref="bean2"></constructor-arg>
</bean>
<bean id="bean2" class="com.example.Bean.Bean2" destroy-method="destroy">
<constructor-arg name="bean1" ref="bean1"></constructor-arg>
</bean>
<bean id="bean1" class="com.example.Bean.Bean1" destroy-method="destroy"></bean>
</beans>
上面我们定义了三个对象bean1 bean2 bean3,且bean3依赖于bean2,bean2依赖于bean1
结论:当我们创建的多个bean有依赖关系时,容器中bean的创建顺序和xml中bean的声明顺序无关,bean的创建顺序只和依赖关系有关,比如说a依赖于b,那么b肯定在a前面被创建。而销毁顺序,则是bean的创建顺序的逆序(即先销毁当前bean,再去销毁该bean依赖的bean)。
通过depend-on干预bean创建和销毁顺序
上面看到了对于无依赖的bean,通过定义的顺序确实可以干预bean的创建顺序,通过强依赖也可以干 预bean的创建顺序。
那么如果xml中定义的bean特别多,而有些bean之间也没有强依赖关系,此时如果想去调整bean的创建和销毁的顺序,得去调整xml中bean的定义顺序,或者去加强依赖,这样是非常不好的,spring中可以通过depend-on来解决这些问题,在不调整bean的定义顺序和强加依赖的情况下,可以通过通过 depend-on 属性来设置当前bean的依赖于哪些bean,那么可以保证depend-on指定的bean在当前bean 之前先创建好,销毁的时候在当前bean之后进行销毁。
<bean id="bean1" class="" depend-on="bean2;bean3;bean4"/>
depend-on:设置当前bean依赖的bean名称,可以指定多个,多个之间可以用”,;空格“进行分割 上面不管bean2,bean2,bean4在任何地方定义,都可以确保在bean1创建之前,会先将 bean2,bean3,bean4创建好,表示bean1依赖于这3个bean,可能bean1需要用到bean2、bean3、 bean4中生成的一些资源或者其他的功能等,但是又没有强制去在bean1类中通过属性定义强依赖的方 式去依赖于bean2、bean3、bean4;当然销毁的时候也会先销毁当前bean,再去销毁被依赖的bean,即先销毁bean1,再去销毁depend-on指定的bean。
public class Bean1 {
Bean1(){
System.out.println("bean1 running...");
}
public void destroy(){
System.out.println("bean1 销毁");
}
}
public class Bean2 {
Bean2(){
System.out.println("bean2 running...");
}
public void destroy(){
System.out.println("bean2 销毁");
}
}
public class Bean3 {
Bean3(){
System.out.println("bean3 running...");
}
public void destroy(){
System.out.println("bean3 销毁");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="bean1" class="com.example.Bean.Bean1" destroy-method="destroy"></bean>
<bean id="bean2" class="com.example.Bean.Bean2" destroy-method="destroy" depends-on="bean1,bean3"></bean>
<bean id="bean3" class="com.example.Bean.Bean3" destroy-method="destroy"></bean>
</beans>
运行后控制台打印:
总结
- 无依赖的bean创建顺序和定义的顺序一致,销毁顺序刚好相反
- 通过构造器强依赖的bean,会先创建构造器参数中对应的bean,然后才会创建当前bean,销毁顺序刚好相反
- depend-on可以指定当前bean依赖的bean,通过这个可以确保depend-on指定的bean在当前 bean创建之前先创建好,销毁顺序刚好相反