1.了解@Autowired

在这之前你得了解SpringIOC容器的相关知识。

含义:@Autowired表示某个属性是否需要进行依赖注入 ,可以写在属性和方法上。注解中的required属性默认为ture,表示如果没有对象注入给属性则抛出异常

自动装配有两种实现方式:通过xml配置的方式与注解的方式。

@Autowired相比于xml配置方式

替换:autowire属性,自动装配(按照类型装配,通过set方法,且方法可以省略)

位置:修饰属性,set方法

语法:@Autowired(required="true")

注意:

1.如果容器中没有一个可以与之匹配且required属性为true则会报异常  NoSuchBeanDefinitionException

2.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称装配

3.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称装配,如果名称也没有匹配,则报异常 NoUniqueBeanDefinitionException

2.底层实现原理:

- 位置

@Autowired的源码

private InjectionMetadata buildAutowiringMetadata(final Class<?> clazz) {LinkedList<InjectionMetadata.InjectedElement> elements = new LinkedList<>();Class<?> targetClass = clazz;//需要处理的目标类do {final LinkedList<InjectionMetadata.InjectedElement> currElements = new LinkedList<>();/*通过反射获取该类所有的字段,并遍历每一个字段,并通过方法findAutowiredAnnotation遍历每一个字段的所用注解,并如果用autowired修饰了,则返回auotowired相关属性*/  ReflectionUtils.doWithLocalFields(targetClass, field -> {AnnotationAttributes ann = findAutowiredAnnotation(field);if (ann != null) {//校验autowired注解是否用在了static方法上if (Modifier.isStatic(field.getModifiers())) {if (logger.isWarnEnabled()) {logger.warn("Autowired annotation is not supported on static fields: " + field);}return;}//判断是否指定了requiredboolean required = determineRequiredStatus(ann);currElements.add(new AutowiredFieldElement(field, required));}});//和上面一样的逻辑,但是是通过反射处理类的methodReflectionUtils.doWithLocalMethods(targetClass, method -> {Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);if (!BridgeMethodResolver.isVisibilityBridgeMethodPair(method, bridgedMethod)) {return;}AnnotationAttributes ann = findAutowiredAnnotation(bridgedMethod);if (ann != null && method.equals(ClassUtils.getMostSpecificMethod(method, clazz))) {if (Modifier.isStatic(method.getModifiers())) {if (logger.isWarnEnabled()) {logger.warn("Autowired annotation is not supported on static methods: " + method);}return;}if (method.getParameterCount() == 0) {if (logger.isWarnEnabled()) {logger.warn("Autowired annotation should only be used on methods with parameters: " +method);}}boolean required = determineRequiredStatus(ann);PropertyDescriptor pd = BeanUtils.findPropertyForMethod(bridgedMethod, clazz);currElements.add(new AutowiredMethodElement(method, required, pd));}});//用@Autowired修饰的注解可能不止一个,因此都加在currElements这个容器里面,一起处理  elements.addAll(0, currElements);targetClass = targetClass.getSuperclass();}while (targetClass != null && targetClass != Object.class);return new InjectionMetadata(clazz, elements);}

结合注释就能看懂它做的事情了。   postProcessMergedBeanDefinition()方法的作用是找到需要自动装配的元素,构建元数据信息,然后封装到AutowiredFieledElement或AutowiredMethodElement中,然后在调用其中的inject方法,通过反射,调用容器的getBean()方法找到需要注入的Bean对象,然后注入到Bean中。

    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {InjectionMetadata metadata = this.findAutowiringMetadata(beanName, beanType, (PropertyValues)null);metadata.checkConfigMembers(beanDefinition);}

@Autowired的实现原理相关推荐

  1. @Autowired注解实现原理

    在讨论代码细节之前,我们再来了解下基础知识.Spring管理可用于整个应用程序的Java对象bean.他们所在的Spring容器,被称为应用程序上下文.这意味着我们不需要处理他们的生命周期(初始化,销 ...

  2. Spring @AutoWired实现原理

    昨晚在使用JUnit测试AOP实现时,出现一个问题.在JUnit使用@AutoWired注入某一个对象,Bean Factory里面有该接口的多个实现,Spring不报错,而始终注入的是一个实现类的实 ...

  3. 关于@Autowired后Spring无法注入的问题

    1.对于新手来说,最明显的不过是在applicationContext.xml文件上没有加<context:component-scan base-package="com.xxx&q ...

  4. @autowired注解注入为null_Spring @Autowired 注解自动注入流程是怎么样?

    面试中碰到面试官问:"Spring 注解是如果工作的?",当前我一惊,完了这不触及到我的知识误区了吗?,还好我机智,灵机一动回了句:Spring 注解的工作流程倒还没有看到,但是我 ...

  5. 你所不知道的Spring的@Autowired实现细节

    相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Spring中是如何实现的呢?这就要分析Spring源码才能知道了. ...

  6. java线程池的使用例子,不愧是大佬

    京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作 ...

  7. 一个星期+4轮面试终拿下offer,进阶学习

    京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作 ...

  8. hashmap应用场景_京东4面(Java研发):事务隔离+乐观锁+HashMap+秒杀设计+微服务

    一面(基础面:约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作用范围? 索引是什 ...

  9. java教程传智播客,面试真题解析

    01 阿里中间件(四面,Java岗) 1.1 Java中间件一面 技术一面考察范围 重点问了Java线程锁:synchronized 和ReentrantLock相关的底层实现 线程池的底层实现以及常 ...

最新文章

  1. Keras快速上手:基于Python的深度学习
  2. 一天学完spark的Scala基础语法教程五、闭包(idea版本)
  3. Java中Cookie常用操作类(Spring中操作Cookie)
  4. python 开源框架学习
  5. 石头剪刀布python代码_Python实现的石头剪子布代码分享
  6. 真是蛋疼,cvet网测
  7. Asp.net发布的CheckList
  8. Zigbee协议栈中文说明
  9. 电梯液晶显示控制方案
  10. Oracle数据库逻辑备份与恢复(3)——数据泵(expdp、impdp)
  11. html5页面打不开原因,有网但是网页打不开是什么原因(原因及2种解决方法)
  12. MSP430待机功耗问题
  13. (java)水果类(增删改查)
  14. 网络安全应急响应事件场景二
  15. 测试指令和位测试指令的用法-TEST
  16. HDUOJ 1078 FatMouse and Cheese
  17. 一文读懂H5,APP,WAP,公众号支付等多种支付方式的区别
  18. shell 对文件或文件夹加密压缩及解压
  19. 合宙Air105|摄像头|capture|SPI|Serial 串口|TFTLCD|Micro SD卡|GC032A|USB转TTL|官方demo|学习(2-1):摄像头camera-capture
  20. [python 爬虫]Python爬虫抓取虎扑论坛帖子图片

热门文章

  1. 姿态解算过程中四元数的更新
  2. 酒精测试仪方案:酒精测试仪是根据什么原理测酒精溶度?
  3. 【ROS】Ros 发布2d boundingbox消息
  4. 深入理解Lustre文件系统-第6篇 OST和obdfilter
  5. hbird html5,HTML5 Three.js 群集的飞鸟
  6. SAP FREE合同中的霸王条款
  7. wp主题php修改,修改WordPress主题
  8. 44.编写一个函数,该函数可以统计一个长度为2的字符串在另一个字符串中出现的次数。
  9. 推荐给大数据学习者的八本书,还有详细的系统路线
  10. 电设3----脉冲信号测试仪