depends-on的用法

首先要了解depends-on用来表示一个bean A的实例化依靠另一个bean B的实例化, 但是A并不需要持有一个B的对象,如果需要的话就不用depends-on,直接用依赖注入就可以了。

1)depends-on使用实例

public class person {
    public static void say(){
        System.out.println("person.say():Im a person");
    }
}
public class man {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
    public void say(){
        person.say();
        System.out.println("man.say():Im a man:"+name);
    }
}
<bean id="person" class="com.roadArchitectWeb.dao.person">
</bean>
<bean id="man" class="com.roadArchitectWeb.dao.man" depends-on="person">
<property name="name" value="zhangsan"></property>
</bean>
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        man man = (man)ctx.getBean("man");
        man.say();
打印结果:

person.say():Im a person
man.say():Im a man:zhangsan

2) 讨论depends-on本质问题,当使用depends-on时,它会对它指向的bean进行一个实例化请求;明确这一点后,我们看下面几条

3)如果A既依赖于B,而A又需要持有B的实例,那么使用构造器注入就可以了。

因为构造器注入,如果参数没有实例化,构造函数无法执行,这就满足了依赖关系;然后再进行注入,这就满足了持有B实例的条件。  同时,这个时候不能再使用depends-on,如果bean B是singleton模式的话可以,用depends-on只是多此一举,如果非singleton的话,就会产生两次实例化请求,两次实例化,这可能不是你想要的。

4)同样是如果A既依赖于B,而A又需要持有B的实例,那么也可以使用setter方式注入。 

因为setter在注入时,A已经实例化,所以不能实现对B依赖关系,这个时候就要加上depends-on, 但是bean  B必须是singleton模式,否则也会产生两次实例化。

5)如果A不依赖于B,但是需要B的实例,单单使用setter就好了。

PS:上述均已验证

 

学:https://blog.csdn.net/Jintao_Ma/article/details/51088867
posted @ 2018-07-13 15:38  舞羊  阅读(1013)  评论(0编辑  收藏  举报