@AutoWired 註釋,他能夠對類成員變量、方法及構造函數進行標註,完成自動裝配的工做。經過@AutoWired的使用來消除set、get 方法。在使用 @AutoWired以前,對bean配置起屬性是,是這樣用的。html
<property name="屬性名" value=" 屬性值"/>
經過這種方式來,配置比較繁瑣,並且代碼比較多。在Spring 2.5 引入了 @Autowired 註釋java
UserRepository.javaspring
package com.proc.bean.repository; public interface UserRepository { void save(); }
這裏定義了一個UserRepository接口,其中定義了一個save方法app
UserRepositoryImps.javaide
package com.proc.bean.repository; import org.springframework.stereotype.Repository; @Repository("userRepository") public class UserRepositoryImps implements UserRepository{ @Override public void save() { System.out.println("UserRepositoryImps save"); } }
定義一個UserRepository接口的實現類,並實現save方法,在這裏指定了該bean在IoC中標識符名稱爲userRepository函數
UserService.java測試
package com.proc.bean.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.proc.bean.repository.UserRepository; @Service public class UserService { @Autowired private UserRepository userRepository; public void save(){ userRepository.save(); } }
這裏須要一個UserRepository類型的屬性,經過@Autowired自動裝配方式,從IoC容器中去查找到,並返回給該屬性ui
applicationContext.xml配置code
<context:component-scan base-package="com.proc.bean" />
測試代碼:component
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService=(UserService) ctx.getBean("userService"); userService.save();
輸出結果:UserRepositoryImps save
那麼使用@Autowired的原理是什麼? 其實在啓動spring IoC時,容器自動裝載了一個AutowiredAnnotationBeanPostProcessor後置處理器,當容器掃描到@Autowied、@Resource或@Inject時,就會在IoC容器自動查找須要的bean,並裝配給該對象的屬性
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
在使用@Autowired時,首先在容器中查詢對應類型的bean
舉例說明: 在上面例子中,咱們在定一個類來實現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的名稱,代碼這樣寫
@Autowired @Qualifier("userJdbcImps") private UserRepository userRepository;
輸出結果:UserJdbcImps save