多選擇是好事嘛?
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. 若要實現自動組裝也需要導入
或也可使用
----------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------
@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 中,程式碼如下:
注意:@Resource(name=“”) 中的name 為指定要注入的對象,testA 為spring 設定檔中所定義bean 的id。
<context:annotation-config /> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
备注:JSR250注解有 @PostConstruct,@PreDestroy 。
JSR330注解有 @Inject (代替 @AutoWired)、@Named (代替 @Component)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ComponentScan(basePackages=“×××××”)注解:启用组件扫描基础包。
1.在 spring 配置文件中加入
配置完成后,
备注:加入该元素后,就不需要再向 spring 配置文件中注入相关的类,即不需要再使用如下配置:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
2.
@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为标记。