@Autowired


@Autowired 字段

我們可以把 @Autowired 注解標注在類文件中的字段屬性上,通過這種方式,Spring 容器啟動的時候會查找相應的 Bean ,然后通過反射的方式注入到這個字段中。

@Controller
public class PayController {
    @Autowired
    PayService aliPayService;
}

這種方式使用起來非常方便,而且對於字段的要求也比較低,它可以是 public,也可以是 private范圍。

@Autowired 構造方法

第二種方式,我們可以使用類中的構造函數注入相應屬性,例子如下:

@Controller
public class PayController {
    
    PayService aliPayService;
    
    @Autowired
    public PayController(PayService aliPayService) {
        this.aliPayService = aliPayService;
    }
}

@Autowired 構造方法里的傳參,可以是一個,也可以是多個。如果是多個參數,那 Spring 一起都注入進來。

@Controller
public class PayController {

    PayService aliPayService;
    
    OrderService orderService;
    
    @Autowired
    public PayController(PayService aliPayService, OrderService orderService) {
        this.aliPayService = aliPayService;
        this.orderService=orderService;
    }
}

這種方式在注入多個屬性的時候用起來還是比較方便的。
那其實有一種情況下,如果一個類不存在無參的構造函數,只存在有參的構造函數,那實際上我們即使不用 @Autowired標注,Spring 也會幫我們注入相應的屬性。

可以看到,上面的例子,我們沒有在構造函數上使用 @Autowired標注,但是 IDEA 依然顯示我們成功注入相應的屬性。

@Autowired 方法

第三種方式,我們可以通過方法注入相應屬性,例子如下:

@Controller
public class PayController {

    PayService aliPayService;
    
    @Autowired
    public void setAliPayService(PayService aliPayService) {
        this.aliPayService = aliPayService;
    }
}

那之前我一直以為這種方式只能使用 setxxx才可以成功的注入屬性 ,那其實是我理解錯了,這個方法可以任意的命名。
那方法注入,其實跟構造方法一樣,也可以同時有多個傳參,Spring 將會把這些屬性一起注入。

@Autowired 多個 Bean

最后一種方式,Spring 可以使用 @Autowired 標注 Array (數組),Collections(集合),甚至是 Map (散列表),通過這種命方式注入多個相同類型的 Bean。
比如這種方式,將 PayService 接口所有實現類注入到 Array數組中。

也可以是這種方式,注入到 List 集合中。

上面的兩個例子,數組與集合中的 Bean 的順序是根據 Spring 創建的順序。
如果你想指定里面排序的優先級,那你就需要使用 @Order或者 @Priority 指定一下優先級,比如這樣:

Order/Priority 注解中值越小,那它的優先級就越高。
最后我們還可以將 PayService 接口所有實現類注入到 Map 中,其中里面的 key 就是Spring 的 Bean 的名字。


免責聲明!

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



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