纸上得来终觉浅
首先要了解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:上述均已验证