【Spring學習筆記】4:三種做屬性連線的Annotation,指示初始化和銷燬方法的Annotation
屬性連線
屬性連線是指配置DI的方式,之前學了可以在<bean ...></bean>
裡面使用<constructor-arg .../>
和<property .../>
元素做屬性連線。
Spring裡還可以直接在類裡用Annotation來做屬性連線,以增強或者替代上述兩種方式。
基於Annotation的屬性連線預設不開啟,需要在<beans ...></beans>
里加入:
<context:annotation-config/>
Spring為屬性連線提供了三種Annotation。
@Required
當在setter方法前新增@Required
後,該類的Bean就必須使用這個setter方法注入屬性,即在<bean ...></bean>
內一定需要<property .../>
將那個setter維護的屬性注入進來,否則使用時會報BeanInitializationException
並提示需要注入的屬性。
@Autowired
它也具有@Required
的需要注入的語義,同時又具備了根據型別自動注入的強大功能。
修飾setter
當在setter方法前新增@Autowired
後,會基於setter中維護的屬性物件所在的實現類,在<beans ...></beans>
<bean .../>
,將其注入。而不需要使用<property .../>
元素做顯式屬性連線。
修飾屬性
當在屬性錢新增@Autowired
後,作用和在setter前一樣,而且可以去掉這個屬性的setter方法了,因為是直接基於型別注入到屬性的,沒有經過setter。
修飾構造器
當在構造器前新增@Autowired
後,會根據構造器需要傳入的物件型別,直接將<beans ...></beans>
裡配置的對應類的<bean .../>
傳給該構造器,並使用該構造器構造物件。
@Autowired(required=false)
相當於這個@Autowired
可以不工作,如兩個setter都用@Autowired
做了修飾,而有一個設定為@Autowired(required=false)
,那麼對這個屬性而言,不提供<property .../>
元素,即不傳入依賴並呼叫這個setter,也被允許。
@Qualifier(“bean的id”)
@Qualifier
可以用於消除基於型別注入時的混亂,因為很可能有多個<bean ...></bean>
是同一個實現類的。
如在<beans ...></beans>
裡有實現類相同的Bean:
<bean id="lzh1" class="myBean.Student">
...
</bean>
<bean id="lzh2" class="myBean.Student">
...
</bean>
那麼某個類要自動注入lzh2而不是lzh1時,僅使用@Autowired
就會有二義性,正確的做法是:
@Autowired
@Qualifier("lzh2")
private Student stdt;
即將@Qualifier("bean的id")
夾在@Autowired
和它所修飾的屬性/setter/構造器之間即可。
@PostConstruct
使用@PostConstruct
修飾一個類中的成員方法,則不需要通過配置<bean ...></bean>
的init-method
屬性指定初始化方法。
該方法會在依賴注入完成之後被呼叫。
@PreDestroy
使用@PreDestroy
修飾一個類中的成員方法,則不需要通過配置<bean ...></bean>
的destroy-method
屬性指定銷燬方法。
該方法會在context.registerShutdownHook()
之內,context.close()
執行後被呼叫。