SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?

这篇具有很好参考价值的文章主要介绍了SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

@Value java doc文档指出,它是由AutowiredAnnotationBeanPostProcessor这个BeanPostProcessor处理的。
AutowiredAnnotationBeanPostProcessor的构造方法如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
可见AutowiredAnnotationBeanPostProcessor用来处理@Autowired和@Value这两个注解。
具体的处理流程是通过在容器对bean进行实例化的时候应用上述BeanPostProcessor.

示例分析(以@Value为例):
controller类:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
启动类:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端

完整流程如下:
主类运行main方法,运行到SpringApplication的静态run方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
该方法调用了重载的run方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
该方法首先创建出了一个SpringApplication对象,然后调用了该对象的run方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
该run方法中调用了refreshContex方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
refreshContext方法调用了refresh方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
该方法又调用了applicationContext对象的refresh方法,此处的applicationContext的实际类型是ServletWebServerApplicationContext,所以调用的是ServletWebServerApplicationContext的refresh方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
这个refresh方法调用了父类的refresh方法,也就是AbstractApplicationContext的refresh方法:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中会调用finisheBeanFactoryInitialization方法,它的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中会调用preInstantiateSingletons方法,它的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
preInstantiateSingletons这个方法会实例化所有的singleton的bean,
在实例化我自己定义的DemoController类的这个bean时,

其中调用的getBean方法代码如下(位于AbstractBeanFactory类):
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中调用的doGetBean方法代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
然后会执行到上图中画线的getSingleton,因为此时demoController这个bean还不存在,所以,getSingleton执行过成中会调用lambda表达式中的createBean来创建democontroller bean, createBean的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中调用了doCreateBean,它的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端

其中调用了populateBean,它的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中对容器中的BeanPostProcessor(AutowiredAnnotationBeanPostProcessor包含在其中)进行遍历,调用了postProcessProperties方法,AutowiredAnnotationBeanPostProcessor的postProcessProperties代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中调用的inject方法代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端

其中调用的inject方法代码如下(位于AutowiredAnnotationBeanPostProcessor):
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
可以看到这个方法首先拿到了要注入的值(value = resolveFieldValue(field, bean, beanName),然后利用反射给bean的属性设置了值(field.set(bean,value)).
resolveFiledValue的逻辑是什么呢?代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中调用了beanFactory.resolveDependency方法,它的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中调用了doResolveDependency,它的代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
其中调用的resolveEmbededValue代码如下:
SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?,SpringBoot,spring boot,java,后端
在其中会遍历embeddedValueResolvers成员变量,用它所包含的StringValueResolver进行解析,最后把解析的结果返回。文章来源地址https://www.toymoban.com/news/detail-641329.html

到了这里,关于SpringBoot复习:(18)@Value和@Autowired注解配置的属性是怎么注入到bean中的?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于在 springboot 中使用 @Autowired 注解来对 TemplateEngine 进行自动装配时,无法注入的问题。

    本文是基于江南一点雨的 Spring Boot+Vue 系列视频教程第 三 章的第三节,详情参考Spring Boot+Vue系列视频教程 在观看学习这一节时,发现当进行手动渲染 Thymeleaf 模板时,通过 @Autowired 注解来对 TemplateEngine 进行自动装配时,发现 idea 对其显示 No beans of \\\'TemplateEngine \\\' type of found。

    2024年02月02日
    浏览(39)
  • 如何在SpringBoot中使用@Value注解来设置默认值

    👽👽👽在Spring Boot中,使用@Value注解可以为属性设置默认值。 @Value注解可以用于注入以下类型的属性: 1、基本数据类型(如字符串、整数、浮点数等) 2、基本数据类型的数组 3、集合类型(如List、Set等) 4、自定义数据类型,包括自定义对象和自定义对象的集合 5、Spri

    2024年02月11日
    浏览(30)
  • SpringBoot复习:(7)@Profile注解

    其中,student这个bean只有指定了profile才会装配,比如在application.properties中: @Profile注解不仅可以用在@Bean上,还可以用在注解类上,用在注解类时 只有设定了profile为指定的值,该配置类中的所有bean才会装配

    2024年02月15日
    浏览(33)
  • SpringBoot复习(30):@DateTimeFormat注解的使用

    一、实体类 二、控制器类:

    2024年02月13日
    浏览(33)
  • Spring Boot项目怎么对System.setProperty(key, value)设置的属性进行读取加解密

    之前我写过一篇文章使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密),对Spring Boot项目的属性读取时进行加解密,但是没有说明对System.setProperty(key, value)设置的属性进行读取加解密,这个在开发过程中应该怎么实现呢

    2024年02月22日
    浏览(40)
  • SpringBoot复习:(34)@EnableWebMvc注解为什么让@WebMvcAutoconfiguration失效?

    它导入了DelegatingWebMvcConfiguration 它会把容器中的类型为WebMvcConfigurer的bean注入到类型为WebMvcConfigurerComposite的成员变量configurers中。 可以看到它继承了WebMvcConfigurerSupport类 而WebMvcConfigureAutoConfiguration类定义如下 可以看到一个@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)注解。 所

    2024年02月13日
    浏览(38)
  • Spring @Autowired 注解原理

    被扫描的组件配置类 输出结果 定位@Autowired所在包 org.springframework.beans.factory.annotation.Autowired 找到同包下 AutowiredAnnotationBeanPostProcessor AutowiredAnnotationBeanPostProcessor 的类继承图如下 AutowiredAnnotationBeanPostProcessor实现了InstantiationAwareBeanPostProcessor与 MergedBeanDefinitionPostProcessor两个Bea

    2024年02月16日
    浏览(34)
  • autowired和resource注解的区别

    注入规则不同 Autowired注解是spring的注解,此注解只根据type进行注入,不会去匹配name.但是如果只根据type无法辨别注入对象时,就需要配合使用@Qualifier注解或者@Primary注解使用。 Resource注解有两个重要的属性,分别是name和type,如果name属性有值,则使用byName的自动注入策略,将值

    2024年02月10日
    浏览(40)
  • Spring属性注解对配置项名称的自动转换

           在Spring中,我们经常需要将配置文件中的属性值注入到Java类中。Spring提供了两个主要的注解来实现这一功能: @Value 和 @ConfigurationProperties 。其中 @ConfigurationProperties 支持将配置项名称与Java类中的属性名进行自动转换,包括 \\\' - \\\' 和\\\' 驼峰命名 \\\'的转换;而 @Value 不支

    2024年02月15日
    浏览(27)
  • @Autowired注解以及失效几个原因

    1、Autowired注解作用 使构造函数、字段、设值方法或配置方法可以被Spring依赖注入工具自动装配(Autowired)。 用于字段:字段在bean构造之后,任何配置方法被调用之前被注入。被注入的类需要是一个组件(@Component)。该注解不要求字段是public。 在构造 bean 之后,在调用任何

    2023年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包