版權(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 @Autowired12 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" />
測試代碼:
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;@Repositorypublic class UserJdbcImps implements UserRepository { @Override public void save() { System.out.println("UserJdbcImps save"); }}
這時(shí)在啟動(dòng)容器后,在容器中有兩個(gè)UserRepository類型的實(shí)例,一個(gè)名稱為userRepository,另一個(gè)為userJdbcImps。在UserService中
@Autowiredprivate UserRepository userRepository;
輸出結(jié)果:UserRepositoryImps save
這里由于查詢到有兩個(gè)該類型的實(shí)例,那么采用名稱匹配方式,在容器中查找名稱為userRepository的實(shí)例,并自動(dòng)裝配給該參數(shù)。
如果這里想要裝載userJdbcImps的實(shí)例,除了將字段userRepository名稱改成userJdbcImps外,可以提供了一個(gè)@Qualifier標(biāo)記,來指定需要裝配bean的名稱,代碼這樣寫
1 @Autowired2 @Qualifier("userJdbcImps")3 private UserRepository userRepository;
輸出結(jié)果:UserJdbcImps save
聯(lián)系客服