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:上述均已验证

你可能感兴趣的:(bean,depends-on)