spring 註解多選擇是好事嘛? Spring 經過十多年的快速發展和更新,以其獨特的創新帶來了大量的擁躉者,在選擇方面還帶來了更多選擇!譬如spring bean的裝配(在XML中進行顯式配置、在Java中進行顯式配置、隱式的bean發現機制和自動裝配),註解的多元化(基本註解、jsr250、j ...
spring 註解
多選擇是好事嘛?
Spring 經過十多年的快速發展和更新,以其獨特的創新帶來了大量的擁躉者,在選擇方面還帶來了更多選擇!譬如spring bean的裝配(在XML中進行顯式配置、在Java中進行顯式配置、隱式的bean發現機制和自動裝配),註解的多元化(基本註解、jsr250、jsr330)等等!
而這麼多重覆的選擇難道真的是好事嗎?這是否也以為學習與成本提高,掌握的難度加大?
打個比喻:同樣可以救國,某個叫spring的神經病告訴你可以從醫救國(xml顯式配置),當你學醫正酣的時候,它又告訴你還可以從軍救國(Java顯示配置),當你練習擒拿射擊快要成功的時候,它來告訴你,其實有更簡單的方法可以教育救國(bean的自動裝配)!
作為一個初學者,個人認為,從學 servlet 到 jsp 再到 struts 到現在的 spring ,坑是越挖越大越挖越多啊!
廢話不多說了,下麵來介紹幾個簡單的註解:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Autowired註解:實現自動裝配。
1.在 spring xml 配置文件中需要註入如下兩個類:
<beans>
<bean id="testA" class="..../TestA" />
<bean id="testUtil" class="..../TestUtil" />
</beans>
2.若想要在 testUtil 類中裝配 testA 類,則可以在 testUtil 類中使用@Autowired註解;
如果想將 TestA 註入到 TestUtil 中,代碼如下:
public class TestUtil{
@Autowired
private Test testA;
.......
}
簡單來說,自動裝配就是讓Spring自動滿足bean依賴的一種方法,在滿足依賴的過程中,會在Spring應用上下文中尋找匹配某個bean需求的其他bean。
@Autowired註解不僅能夠用在構造器上,還能用在方法上,和屬性上。如果沒有匹配的bean,那麼在應用上下文創建的時候,Spring會拋出一個異常。為了避免異常的出現,你可以將@Autowired的required屬性設置為false:但是,把required屬性設置為false時,你需要謹慎對待。如果在你的代碼中沒有進行null檢查的話,這個處於未裝配狀態的屬性有可能會出現NullPointerException。
@Autowired他是spring特有的註解,如果你不願意在代碼中到處使用Spring的特定註解來完成自動裝配任務的話,那麼你可以考慮將其替換為@Inject。
在自動裝配中,Spring同時支持@Inject(JSR330註解)和@Autowired。儘管@Inject和@Autowired之間有著一些細微的差別,但是在大多數場景下,它們都是可以互相替換的。
註意:1.它只是提供自動裝配,並不提供註入;而註入是前提。
2. 若要實現自動裝配還需要導入<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>支持
或者也可以使用<context:annotation-config />
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Qualifier註解:對依賴註入的條件進行限制。
如果@Autowired標註的依賴在容器中只能找到一個實例與之對應,則萬事OK,但是如果存在多個同意類型的對象實例,則 @Qualifier 註解將其作用。
假如 Test 類有兩個實現,TestA 和 TestB,在 spring 配置文件中配置代碼如下:
<beans>
<bean id="testA" class="..../TestA" />
<bean id="testB" class="..../TestB" />
<bean id="testUtil" class="..../TestUtil" />
</beans>
如果想將 TestA 註入到 TestUtil 中,代碼如下:
public class TestUtil{
@Autowired
@Qualifier("testA")
private Test testA;
private Test testB;
.......
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Resource(name=“”)註解:實現對 bean 的註入。它的作用與@Autowired註解類似。
1.由於該註解是由JSR250引入的,故而在使用它之前需要導入jsr250相關jar包的支持,在pom.xml文件中加入以下內容:
<!-- jsr250註解包的引入 -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
2.在spring配置文件中註入相關類:
假如 testUtil 類中需要引入 testA 類,在 spring 配置文件中配置代碼如下:
<beans>
<bean id="testA" class="..../TestA" />
<bean id="testUtil" class="..../TestUtil" />
</beans>
3.在 testUtil 中加入 @Resource(name=“”)註解:
如果想將 TestA 註入到 TestUtil 中,代碼如下:
public class TestUtil{
@Resource(name=“testA”)
private Test testA;
private Test testB;
.......
}
註意:@Resource(name=“”) 中的name 為指定要註入的對象,testA 為 spring 配置文件中所定義 bean 的id。
4.以下兩個解釋註解的包至少要引入一個到 spring 配置文件,本著偷懶的原則,個人喜歡 context 元素。
<context:annotation-config />
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
備註:JSR250註解有 @PostConstruct,@PreDestroy 。
JSR330註解有 @Inject (代替 @AutoWired)、@Named (代替 @Component)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ComponentScan(basePackages=“×××××”)註解:啟用組件掃描基礎包。
1.在 spring 配置文件中加入 <context:component-scan>實現。
<context:component-scan base-package="com.lh" />
配置完成後,<context:component-scan>會掃描 com.lh 路徑下的所有標註了的相應註解的類,並添加到IOC容器中,實現依賴註入。
備註:加入該元素後,就不需要再向 spring 配置文件中註入相關的類,即不需要再使用如下配置:
<beans>
<bean id="testA" class="..../TestA" />
<bean id="testUtil" class="..../TestUtil" />
</beans>
2.<context:component-scan> 預設掃描的註解類型是 @Component ,所以需要在相應的類中應用這個註解進行標註。
@Component
public class TestUtil{
@Autowired
private Test testA;
.......
}
@Component
public class TestA{
private int a;
private String ss;
...
}
備註:(1)需要在兩個類中都標註 @Component 註解。
(2)該註解是類級別的,它添加在類之上。
(3)@Component("id號")註解:表明該類會作為組件類,並告知Spring要為這個類創建bean。若id號為空,則預設使用以小寫開頭的類名!若使用自定義id號,則在後續的引用中需要引入以該id為標記。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------