目录
五、AutowiredAnnotationBeanPostProcessor#postProcessMergedBeanDefinition()源码
六、AutowiredAnnotationBeanPostProcessor#postProcessProperties()源码
一、概述
@Autowired注解大家再熟悉不过了,在项目中使用 @Autowired注解的比例非常高,可以说基本用过 Spring 的同学都接触过这个注解,因此,我们有必要详细了解一下其工作原理。
@Autowired注解的作用是帮我们注入我们需要的对象,Spring会自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
在分析这个注解的实现原理之前,我们不妨先来回顾一下@Autowired注解的用法。
二、@Autowired注解的用法
先定义几个接口:
@Repository
public class UserDao {
public void insert() {
// 执行数据库操作
}
}
public interface UserService {
void insert();
}
@Autowired注解的主要使用方式有下面四种:
-
(一)、@Autowired注解应用于构造函数
@Service
public class UserServiceImpl implements UserService {private final UserDao userDao; @Autowired public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } @Override public void insert() { userDao.insert(); }
}
-
(二)、@Autowired注释应用于setter方法
@Service
public class UserServiceImpl implements UserService {private UserDao userDao; @Autowired public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void insert() { userDao.insert(); }
}
-
(三)、@Autowired应用于字段
@Service
public class UserServiceImpl implements UserService {@Autowired private UserDao userDao; @Override public void insert() { userDao.insert(); }
}
-
(四)、@Autowired应用于类型数组/集合对象的字段或方法
public interface ICalculateStrategy {
void calculate();
}@Component
public class StategyA implements ICalculateStrategy {
@Override
public void calculate() {}
}
@Component
public class StategyB implements ICalculateStrategy {
@Override
public void calculate() {}
}
@Service
public class UserServiceImpl implements UserService {@Autowired private ICalculateStrategy[] calculateStrategies; @Autowired private List<ICalculateStrategy> calculateStrategyList; @Override public void insert() { //[com.wsh.autowired.StategyA@490d6c15, com.wsh.autowired.StategyB@7d4793a8] System.out.println(Arrays.toString(calculateStrategies)); //[com.wsh.autowired.StategyA@490d6c15, com.wsh.autowired.StategyB@7d4793a8] System.out.println(calculateStrategyList); }
}
@Configuration
@ComponentScan(“com.wsh.autowired”)
public class AppConfig {}
public class Client {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = (UserService) annotationConfigApplicationContext.getBean(“userServiceImpl”);
userService.insert();
}
}
三、@Autowired自动装配原理
首先看一下@Autowired这个注解在Spring中的定义:
// 可作用于: 构造方法、普通方法、参数、字段、注解上
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
// 保留策略是运行时
@Retention(RetentionPolicy.RUNTIME)
// @Documented: 表明是否在java doc中添加Annotation
@Documented
public @interface Autowired {
/**
* 声明这个依赖是否必须,默认为true
*/
boolean required() default true;
}
我们可以看到,@Autowired注解可以应用在构造方法,普通方法,参数,字段,以及注解这五种类型的地方,它的保留策略是在运行时。在Spring中,@Autowired注解位于org.springframework.beans.factory.annotation包下面,我们发现在这个包下面还有一个关键的类:AutowiredAnnotationBeanPostProcessor。
看名字盲猜AutowiredAnnotationBeanPostProcessor可能与@Autowired自动注入功能