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