通常我们用spring的时候注入的属性都是指定的类实例或者List或Array,对于这一类的应用通常我们都是使用spring默认的根据bean的id或者name来在容器里查找,但是有些时候在一些特殊应用中对于一个bean的某个属性并不是固定的,此时就可以用到spring的另外一种注入方式就是autowire="byType"。如下例子:
一个接口类和几个实现类MyIdProvider.java
- public interface MyIdProvider {
- String getId();
- }
- class MyIdProviderImpl1 implements MyIdProvider {
- public String getId() {
- return "provider1_" + System.currentTimeMillis();
- }
- }
- class MyIdProviderImpl2 implements MyIdProvider {
- public String getId() {
- return "provider2_" + System.currentTimeMillis();
- }
- }
- class MyIdProviderImpl3 implements MyIdProvider {
- public String getId() {
- return "provider3_" + System.currentTimeMillis();
- }
- }
MyIdProviderManager.java一个管理类,其中定义了一些对MyIdProvider的引用
- import java.util.List;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class MyIdProviderManager {
-
- 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一个测试类
- import java.util.List;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Test {
-
- 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
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:lang="http://www.springframework.org/schema/lang"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
- http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd"
- default-lazy-init="true">
- <bean id="myIdProviderManager" class="MyIdProviderManager" autowire="byType">
- <property name="name"><value>hello</value></property>
- </bean>
- <bean id="myIdProvider1" class="MyIdProviderImpl1"/>
- <bean id="myIdProvider2" class="MyIdProviderImpl2"/>
- <bean id="myIdProvider3" class="MyIdProviderImpl3"/>
- </beans>
运行Test类,得到如下输出
hello
provider1_1290559324155
provider2_1290559324155
provider3_1290559324155
对于byType注入个人认为还是应该少用,因为他确实提供了足够的灵活性,但是确牺牲了类依赖的清晰性,最后有可能导致出现问题了很难找到,因此还是应该谨慎使用,只有在byName不能解决问题的情况在再慎重使用。