Spring进阶(五)之dependOn

目录

无依赖Bean创建和销毁的顺序

通过构造器强依赖bean创建和销毁顺序

通过depend-on干预bean创建和销毁顺序

总结


无依赖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创建之前先创建好,销毁顺序刚好相反
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰魄雕狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值