通常我们用spring的时候注入的属性都是指定的类实例或者List或Array,对于这一类的应用通常我们都是使用spring默认的根据bean的id或者name来在容器里查找,但是有些时候在一些特殊应用中对于一个bean的某个属性并不是固定的,此时就可以用到spring的另外一种注入方式就是autowire="byType"。如下例子:
一个接口类和几个实现类MyIdProvider.java
MyIdProviderManager.java一个管理类,其中定义了一些对MyIdProvider的引用
private String name;
private List<MyIdProvider> myIdProviders;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<MyIdProvider> getMyIdProviders() {
return myIdProviders;
}
public void setMyIdProviders(List<MyIdProvider> myIdProviders) {
this.myIdProviders = myIdProviders;
}
}
Test.java一个测试类
public static void main(String[] args) throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/org/garbagecan/springstudy/beansfactory/spring-provider.xml");
MyIdProviderManager manager = (MyIdProviderManager) ctx.getBean("myIdProviderManager");
System.out.println(manager.getName());
List<MyIdProvider> myIdProviders = manager.getMyIdProviders();
for (MyIdProvider myIdProvider : myIdProviders) {
System.out.println(myIdProvider.getId());
}
}
}
spring.xml
运行Test类,得到如下输出
hello
provider1_1290559324155
provider2_1290559324155
provider3_1290559324155
对于byType注入个人认为还是应该少用,因为他确实提供了足够的灵活性,但是确牺牲了类依赖的清晰性,最后有可能导致出现问题了很难找到,因此还是应该谨慎使用,只有在byName不能解决问题的情况在再慎重使用。