@Autowired的注入規則


使用@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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM