Spring中@Autowired注解的工作原理

目录

一、概述

二、@Autowired注解的用法

三、@Autowired自动装配原理

四、源码调试环境

五、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自动注入功能

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值