首页 > 其他分享 >聊一聊Spring中的@Value注解

聊一聊Spring中的@Value注解

时间:2024-10-21 22:47:39浏览次数:9  
标签:容器 Spring bean Value MyService 聊一聊 org import

[!NOTE]

**Spring版本:**5.3.27

**JDK版本:**1.8

1、MyConfig.properties何时被加载解析?

2、MyService中的两个@Value何时解析?

3、MyService中的两个@Value何时注入属性文件中的值?

一、样例

服务类

package com.lazy.snail.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * @ClassName MyService
 * @Description TODO
 * @Author lazysnail
 * @Date 2024/10/17 11:42
 * @Version 1.0
 */
@Service
public class MyService {
    @Value("${blog.host}")
    private String host;

    @Value("${blog.email}")
    private String email;

    public void printEmail() {
        System.out.println(this.email);
    }
}

属性配置文件

#MyConfig.properties
blog.host=https://lazysnailstudio.com/
[email protected]

主配置类

@Configuration
@PropertySource(value = "classpath:MyConfig.properties")
@ComponentScan(basePackages = "com.lazy.snail")
public class AppConfig {

}

测试类

package com.lazy.snail;

import com.lazy.snail.service.MyService;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@Slf4j
public class SpringTest {

    @Test
    void test() {
        ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.getBean(MyService.class).printEmail();
    }
}

二、样例分析

1、new AnnotationConfigApplicationContext(AppConfig.class)

创建容器、注册内部bean定义信息、注册配置类bean定义信息

image-20241017170015991

refresh之前容器中的bean定义信息:

image-20241017170518017

2、refresh中invokeBeanFactoryPostProcessors

实例化内部bean(ConfigurationClassPostProcessor)

通过postProcessBeanDefinitionRegistry方法解析配置类

image-20241017172332838

处理配置类AppConifg的注解

image-20241018111008166

@PropertySource的处理会加载MyConfig.properties文件,然后解析其中的键值。

image-20241018111342725

@ComponentScan的处理会构建扫描器,对指定包下所有类进行扫描,符合条件的注册到容器。

此案例此处会把MyService注册到容器。

image-20241018112100156

[!NOTE]

MyService上有@Service注解,@Service注解中有@Component,所以MyService也会被当做配置类进行处理 。走一遍doProcessConfigurationClass方法的逻辑。

ConfigurationClassPostProcessor实现了BeanDefinitionRegistryPostProcessor,BeanDefinitionRegistryPostProcessor又继承了BeanFactoryPostProcessor,所以也具有BeanFactoryPostProcessor功能。

postProcessBeanFactory中对符合条件的配置类进行了增强处理。

image-20241018113418719

invokeBeanFactoryPostProcessors结束,容器中有了MyService的bean定义信息、配置文件信息。

bean定义信息:

image-20241018113917441

配置信息:

image-20241018114048016

3、refresh中registerBeanPostProcessors

1、从bean定义信息集合中找到实现了BeanPostProcessor接口的beanDefinition。

org.springframework.context.annotation.internalAutowiredAnnotationProcessor

org.springframework.context.annotation.internalCommonAnnotationProcessor

这两个beanDefinition是最初构造AnnotationConfigApplicationContext时注册到容器的。

2、实例化上述两个后置处理器,然后注册到容器

实例化:

image-20241018115317224

注册:

image-20241018115430916

registerBeanPostProcessors结束,容器中多了两个单例对象,两个后置处理器。

单例:

image-20241018115654795

后置处理器:

image-20241018115741108

4、refresh中finishBeanFactoryInitialization

接下来主要看MyService的实例化过程。

preInstantiateSingletons方法会实例化容器中的单例。

得到MyService的引用后,后置处理器处理。

image-20241018134715152

AutowireAnnotationBeanPostProcessor处理,找到MyService上@Value注解的属性。解析出来后添加到beanDefinition中。

image-20241018135546083

开始给属性赋值

image-20241018141222715

image-20241018142138764

至此关于@Value的解析注入就结束了。

三、小结

1、读取解析配置文件信息,加载到容器待用。

2、实例化过程中,通过后置处理器解析@Value。

3、同样通过后置处理器,找到对应的值,赋值给对应属性。

标签:容器,Spring,bean,Value,MyService,聊一聊,org,import
From: https://blog.csdn.net/indolentSnail/article/details/143135421

相关文章

  • SpringBoot篇(配置文件)
    目录一、@ConfigurationProperties1.简介2.实现步骤3.具体如何使用呢?4.感觉这没区别啊?5.知识小结二、宽松绑定/松散绑定1.前言2.什么是宽松绑定?3.为什么这样呢?4.知识小结三、常用计量单位绑定1.前言2.这个时候问题就来了,怎么解决这个误会?四、校验1......
  • SpringBoot篇(一、认识SpringBoot)
    目录一、SpringBoot存在的意义二、为什么要用SpringBoot三、SpringBoot的优点四、Spring&SpringBoot&SpringCloud的关系五、SpringBoot简化操作的体现1.创建独立的Spring应用程序2.嵌入式servlet容器3.提供starter简化Maven配置4.自动配置Spring5......
  • 基于SpringBoot+Vue+Uniapp微信小程序的文化宣传系统设计与实现(源码+文档+部署)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • 基于SpringBoot+Vue+Uniapp微信小程序的学生寝室管理系统设计与实现(源码+文档+部署)
    文章目录1.前言2.详细视频演示3.程序运行示例图4.文档参考5.技术框架5.1后端采用SpringBoot框架5.2前端框架Vue5.3程序操作流程6.选题推荐7.原创毕设案例8.系统测试8.1系统测试的目的8.2系统功能测试9.代码参考10.为什么选择我?11.获取源码1.前言......
  • Spring Boot 发送qq邮箱的步骤和方法
    先去qq邮箱开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,设置服务授权码邮箱==>账号==>管理服务==>开启服务==>生成授权码然后我们导入邮箱依赖<!--邮件发送依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-sta......
  • springcloud入门-项目搭建
    本文主要供小白使用,详述springcloud项目在实战环境中如何搭建以及常见问题的解决方法,各微服务组件的具体使用及原理,后续我会逐步补充。本文后续论述均以如下环境为前提:jdk:1.8spring-boot:2.6.0spring-cloud:2021.0.9一、公共组件搭建1.parent项目搭建1)pom.xml文......
  • Swagge详解,SpringBoot项目集成Swagger
    介绍        相信无论是前端还是后端开发,都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力,经常来不及更新。其实无论是前端调用后端,还是后端调用后端,都期望有一个好的接口文档。但是这个接......
  • springboot接口Get请求实体类入参
    在springboot中,对HTTPGET请求,通常不会将请求体(body)作为主要的数据传输方式,因为GET请求通常用于请求数据,而不是发送数据到服务器(尽管从技术上讲,GET请求可以包含请求体,但这并不常见,也不符合RESTfulAPI的设计原则)。因此,对于GET请求的入参,通常不会使用@RequestBody注解。一、......
  • 基于SpringBoot的银行信用卡额度管理系统
    具体实现截图系统测试从多个角度进行测试找到系统中存在的问题是本系统首要的测试目的,通过功能测试寻找出系统缺陷并改正,确保系统没有缺陷。在测试过程中证明系统满足客户需求,发现问题和不足及时改正。测试完成之后得出测试结论。系统测试目的在酒店管理系统......
  • 基于SpringBoot 的社团管理系统视频
    具体实现截图系统测试从多个角度进行测试找到系统中存在的问题是本系统首要的测试目的,通过功能测试寻找出系统缺陷并改正,确保系统没有缺陷。在测试过程中证明系统满足客户需求,发现问题和不足及时改正。测试完成之后得出测试结论。系统测试目的在酒店管理系统的......