源码如下:

 public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();context.scan("service");context.refresh();for (String s : context.getBeanDefinitionNames()) {System.out.println(s);}UserService userService = (UserService) context.getBean("userService");userService.printUser();}@Servicepublic class UserService {@Autowiredprivate AuthService authService;public void printUser(){System.out.println("user:1");}}@Servicepublic class AuthService {public void login(){System.out.println("login");}}

分析@Autowired:
点击注解查看注解源码:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {/*** Declares whether the annotated dependency is required.* <p>Defaults to {@code true}.*/boolean required() default true;
}

点击Autowired类可以看到:AutowiredAnnotationBeanPostProcessor
进入自动注入的初始化元数据方法postProcessMergedBeanDefinition()

 @Overridepublic void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {if (beanType != null) {搜索每个Bean内@Autowired注解的信息InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);metadata.checkConfigMembers(beanDefinition);}}

注入操作,在bean的实例化之后,调用postProcessPropertyValues()方法


public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);try {metadata.inject(bean, beanName, pvs);}catch (BeanCreationException ex) {throw ex;}catch (Throwable ex) {throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);}return pvs;}

@Autowire原理分析相关推荐

  1. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  2. MyBatis(五)MyBatis整合Spring原理分析

    前面梳理了下MyBatis在单独使用时的工作流程和关键源码,现在看看MyBatis在和Spring整合的时候是怎么工作的 也先从使用开始 Spring整合MyBatis 1.引入依赖,除了MyBati ...

  3. MyBatis整合Spring原理分析

    目录 MyBatis整合Spring原理分析 MapperScan的秘密 简单总结 假如不结合Spring框架,我们使用MyBatis时的一个典型使用方式如下: public class UserDa ...

  4. java signature 性能_Java常见bean mapper的性能及原理分析

    背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...

  5. Select函数实现原理分析

    转载自 http://blog.chinaunix.net/uid-20643761-id-1594860.html select需要驱动程序的支持,驱动程序实现fops内的poll函数.select ...

  6. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  7. 一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:Muscleape jianshu.com/p/0768eb ...

  8. 原理分析_变色近视眼镜原理分析

    随着眼镜的发展,眼镜的外型变得越来越好看,并且眼镜的颜色也变得多姿多彩,让佩戴眼镜的你变得越来越时尚.变色近视眼镜就是由此产生的新型眼镜.变色镜可以随着阳光的强弱变换不同的色彩. 变色眼镜的原理分析 ...

  9. jieba分词_从语言模型原理分析如何jieba更细粒度的分词

    jieba分词是作中文分词常用的一种工具,之前也记录过源码及原理学习.但有的时候发现分词的结果并不是自己最想要的.比如分词"重庆邮电大学",使用精确模式+HMM分词结果是[&quo ...

最新文章

  1. 2432功率计使用说明_为什么说功率计是自行车开挂神器?
  2. Flutter开发环境安装
  3. coding pages绑定freenom.com域名
  4. Visual Basic、C# 和 C++ 的数据类型比较(转)
  5. [TJOI2017]城市(未解决)
  6. [html] html标签的属性值是否可以省略引号?为什么?
  7. oracle asm ora 15041,ORA-15041,ORA-01274 故障解决实例
  8. 设计模式学习-简单工厂模式
  9. 申请一个公网ip多少钱_申请1个条形码多少钱?小作坊如何申请条形码?
  10. step 7在win10上安装教程及安装包
  11. cs 61c学习总结
  12. Python网络爬虫:空姐网、糗百、xxx结果图与源码
  13. centos7.6 安装docker
  14. matlab 理论力学,MATLAB理论力学/高等学校教材
  15. JavaScript 每日一题---LeetCode 122. 买卖股票的最佳时机 II
  16. [笑话] 有关本人现在是独身的消息不甚走漏
  17. SNOI2018 滚粗记
  18. python微信公众号翻译功能怎么用_使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具...
  19. Halcon图像预处理-感兴趣区域(ROI)
  20. IDEA license server 地址

热门文章

  1. 自监督模型 Self-supervised learning(李宏毅2022
  2. python爬了下知乎1000赞+的神回复,笑死人了~
  3. Mini Cheetah 代码分析(七)控制器自动切换运动模式
  4. 像背单词一样搞定机器学习关键概念:300张小抄表满足你的所有AI好奇
  5. 377万考研人,究竟养活了多少产业?
  6. GLFW官方文档中文翻译——开始入门
  7. 文件夹共享和分享其实区别很大!
  8. 部署SCOM2012
  9. 如何开启小米路由器的ssh功能
  10. 1D 、2D and 3D convolution