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作用在方法上,該方法的參數也會按照類型進行自動裝配,然後按照變量名進行裝配,和上面介紹的是一樣的