Spring 註解配置(2)——@Autowired
轉自- 部落格地址:http://www.cnblogs.com/caoyc/p/5626365.html
@Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法。在使用@Autowired之前,我們對一個bean配置起屬性時,是這用用的
<property name="屬性名" value=" 屬性值"/>
通過這種方式來,配置比較繁瑣,而且程式碼比較多。在Spring 2.5 引入了 @Autowired 註釋
下面用案例來具體說明
UserRepository.java
1 package com.proc.bean.repository; 2 3 public interface UserRepository { 4 5 void save(); 6 }
這裡定義了一個UserRepository介面,其中定義了一個save方法
UserRepositoryImps.java
1 package com.proc.bean.repository; 2 3 import org.springframework.stereotype.Repository; 4 5 @Repository("userRepository") 6 public class UserRepositoryImps implements UserRepository{ 7 8 @Override 9 public void save() { 10 System.out.println("UserRepositoryImps save"); 11 } 12 }
定義一個UserRepository介面的實現類,並實現save方法,在這裡指定了該bean在IoC中識別符號名稱為userRepository
UserService.java
1 package com.proc.bean.service; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 import com.proc.bean.repository.UserRepository; 7 8 @Service 9 public class UserService { 10 11 @Autowired 12 private UserRepository userRepository; 13 14 public void save(){ 15 userRepository.save(); 16 } 17 }
這裡需要一個UserRepository型別的屬性,通過@Autowired自動裝配方式,從IoC容器中去查詢到,並返回給該屬性
applicationContext.xml配置
<context:component-scan base-package="com.proc.bean" />
測試程式碼:
1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); 2 3 UserService userService=(UserService) ctx.getBean("userService"); 4 userService.save();
輸出結果:UserRepositoryImps save
那麼使用@Autowired的原理是什麼?
其實在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查詢需要的bean,並裝配給該物件的屬性
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
注意事項:
在使用@Autowired時,首先在容器中查詢對應型別的bean
如果查詢結果剛好為一個,就將該bean裝配給@Autowired指定的資料
如果查詢的結果不止一個,那麼@Autowired會根據名稱來查詢。
如果查詢的結果為空,那麼會丟擲異常。解決方法時,使用required=false
舉例說明:
在上面例子中,我們在定一個類來實現UserRepository介面
package com.proc.bean.repository; import org.springframework.stereotype.Repository; @Repository public class UserJdbcImps implements UserRepository { @Override public void save() { System.out.println("UserJdbcImps save"); } }
這時在啟動容器後,在容器中有兩個UserRepository型別的例項,一個名稱為userRepository,另一個為userJdbcImps。在UserService中
@Autowired private UserRepository userRepository;
輸出結果:UserRepositoryImps save
這裡由於查詢到有兩個該型別的例項,那麼採用名稱匹配方式,在容器中查詢名稱為userRepository的例項,並自動裝配給該引數。
如果這裡想要裝載userJdbcImps的例項,除了將欄位userRepository名稱改成userJdbcImps外,可以提供了一個@Qualifier標記,來指定需要裝配bean的名稱,程式碼這樣寫
1 @Autowired 2 @Qualifier("userJdbcImps") 3 private UserRepository userRepository;
輸出結果:UserJdbcImps save
分類: Spring