天天看點

spring的自動裝配

default/no:不自動裝配

byName: 根據名字進行裝配,以屬性名作為id,在容器中查找這個元件進行指派

byType:根據類型進行裝配

constructor: 使用構造器*

結果如下

找不到則直接指派為null

這個是通過類型來進行裝配。我們知道,不同的元件可以是同一個類型。如果有兩個類型一緻,那麼裝配誰呢?是以在使用時要注意是否有多個相同的類型

找不到也是直接指派為null

試試兩個相同的類型會發生什麼

直接報錯:Could not autowire. There is more than one bean of ‘Car’ type. Beans: car2,car. Properties: ‘car’ less… (Ctrl+F1)

在執行構造器裝配時,會先按照有參構造器參數的類型進行裝配,如果存在元件,則進行指派,不存在,直接為null。如果按照類型找到多個呢?則按照名字進行比對。

現在感覺每次都去配置檔案中配置很麻煩,有沒有更簡單的呢?讓IOC容器自動幫我們裝配答案是使用注解。

在我們使用的類上面添加相應的注解,在配置檔案中掃描我們需要的注解,然後進行自動的裝配,省時省力啊~~~

@Autowired

原理:先按照類型進行比對,比對到一個直接進行注入,比對到多個,再按照屬性的變量名作為id進行比對,然後在指派。沒有,抛異常。

測試一下

如果忘記其中的某一個注解的配置,會出現什麼問題呢?

我們都可以猜測到,會出現空指針的異常

因為在MyService 中 myDao 沒有進行屬性的的注入,那麼它就應該是null,調用null的方法肯定會出現空指針異常啊

作用就是讓spring别用變量名作為id,取一個自定義的名字,當使用時,必須去找到,找不到,直接報錯。

那如果我不想它報錯呢?而是給我裝配null

@Autowired(required = false) 預設時true,必須找到,找不到直接報錯;改成false,不用必須找到,找不到,就null

Autowired作用在方法上,該方法的參數也會按照類型進行自動裝配,然後按照變量名進行裝配,和上面介紹的是一樣的