1. 程式人生 > >【Spring學習筆記】4:三種做屬性連線的Annotation,指示初始化和銷燬方法的Annotation

【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()執行後被呼叫。