版權(quán)聲明:本文為博主原創(chuàng)文章,如需轉(zhuǎn)載請標注轉(zhuǎn)載地址。 博客地址:http://www.cnblogs.com/caoyc/p/5626365.html @Autowired 注釋,它可以對類成員變量、方法及構(gòu)造函數(shù)進行標注,完成自動裝配的工作。 通過 @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接口的實現(xiàn)類,并實現(xiàn)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(); 輸出結(jié)果:UserRepositoryImps save
那么使用@Autowired的原理是什么? 其實在啟動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找需要的bean,并裝配給該對象的屬性 <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
注意事項: 在使用@Autowired時,首先在容器中查詢對應(yīng)類型的bean 如果查詢結(jié)果剛好為一個,就將該bean裝配給@Autowired指定的數(shù)據(jù) 如果查詢的結(jié)果不止一個,那么@Autowired會根據(jù)名稱來查找。 如果查詢的結(jié)果為空,那么會拋出異常。解決方法時,使用required=false
舉例說明: 在上面例子中,我們在定一個類來實現(xiàn)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;
輸出結(jié)果:UserRepositoryImps save 這里由于查詢到有兩個該類型的實例,那么采用名稱匹配方式,在容器中查找名稱為userRepository的實例,并自動裝配給該參數(shù)。
如果這里想要裝載userJdbcImps的實例,除了將字段userRepository名稱改成userJdbcImps外,可以提供了一個@Qualifier標記,來指定需要裝配bean的名稱,代碼這樣寫 1 @Autowired 2 @Qualifier("userJdbcImps") 3 private UserRepository userRepository; 輸出結(jié)果:UserJdbcImps save
|
|
來自: 神志屋 > 《@Autowired》