使用@Autowired注入的bean對於目標類來說,從代碼結構上來講也就是一個普通的成員變量,@Autowired和spring一起工作,通過反射為這個成員變量賦值,也就是將其賦為期望的類實例。
1.一個實現類、注入同類型
@Service public class HelloServiceImpl implements HelloService { @Override public void sayHello() { System.out.println("say hello impl"); } }
@Autowired private HelloService helloService; 或者 @Autowired private HelloService abc;
結果 注入成功
@Autowired 第一是按照類型去匹配的,此時IoC容器中HelloService 接口只有一個實現類,所以屬性名字怎么寫都沒關系,都可以注入進去
2.多個實現類、注入同類型
再增加一個實現類
@Service public class NewHelloServiceImpl implements HelloService { @Override public void sayHello() { System.out.println("new say hello impl"); } }
@Autowired private HelloService abc;
結果注入失敗
因為一個接口有多個實現,所以@Autowired 就按照屬性名字去找,即找一個名字為 abc的bean注入,然而IoC容器不存在一個名字叫abc的 bean,因此報錯,把屬性名改為下面任意一種就可以匹配到了
@Autowired private HelloService helloServiceImpl; @Autowired private HelloService newHelloServiceImpl;
3.多個實現類、注入同類型、指定固定屬性名稱
1.注入對象不變,改實現類
@Service("abc")--修改這個 public class HelloServiceImpl implements HelloService { @Override public void sayHello() { System.out.println("say hello impl"); } }
@Autowired private HelloService abc;
注入成功了
或者
2.實現類不變,改注入對象
@Service public class HelloServiceImpl implements HelloService { @Override public void sayHello() { System.out.println("say hello impl"); } }
@Autowired @Qualifier("helloServiceImpl")--增加這個 private HelloService abc;
總結:
1.一個接口只有一個實現的情況下,屬性名字怎么寫都無所謂,因為按照類型匹配就只有一個bean
2.一個接口多個實現的情況下:
① 屬性名字跟組件名字一致,組件名字可以在聲明的時候指定,比如 @Service("abc")
② 屬性名字跟組件名字不一致,配合@Qualifier 注解指定組件名字
轉載自:https://www.cnblogs.com/convict/p/10688335.html