@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