13 14 15 Spring Boot 自动配置原理是什么?

13 14 15 了解自动配置原理 脑图

15、Spring Boot 自动配置原理是什么?

Spring boot自动装配,是指spring应用程序上下文,根据类路径,和定义的bean,猜测并自动装配该应用程序可能要用到的bean。

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,
首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。
@EnableAutoConfiguration是实现自动配置的注解
@Configuration表示这是一个配置文件
Spring Boot的自动配置注解是@EnableAutoConfiguration

2.4 自动配置原理

2.4.1 加载spring.factories

SpringApplication类构建的时候,有这样一段初始化代码:
在这里插入图片描述
跟进去往下走
在这里插入图片描述
这里发现会通过loadFactoryNames尝试加载一些FactoryName,然后利用createSpringFactoriesInstances将这些加载到的类名进行实例化。 继续跟进loadFactoryNames方法:
在这里插入图片描述
发现此处会利用类加载器加载一个文件: META-INF/spring.factories 。我们知道,ClassLoader默认是从classpath下读取文件,因此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样的文件:
在这里插入图片描述
我们引入的任何第三方启动器,只要实现自动配置,也都会有类似文件。

加载spring.factories的流程

1 ,SpringApplication类构建
2,(setListeners)设置监听 (getSpringFactoriesInstances)GetSpringFactories实例 ,如何获取实例呢?
3,点进获取实例的方法 (loadFactoryNames)接着加载工厂名称
这里发现会通过loadFactoryNames尝试加载一些FactoryName,然后利用createSpringFactoriesInstances将这些加载到的类名进行实例化。 继续跟进loadFactoryNames方法:
4,加载好工厂名称了 **直接 loadSpringFactories(加载spring工厂)**去哪加载呢?
发现此处会利用类加载器加载一个文件: META-INF/spring.factories 。我们知道,ClassLoader默认是从classpath下读取文件,因此,SpringBoot会在初始化的时候,加载所有classpath:META-INF/spring.factories文件,包括jar包当中的。而在Spring的一个依赖包:spring-boot-autoconfigure中,就有这样的文件:

总结:类构建
设监听 获实例
加工名(通过加工厂获取) 实例化
加工厂 类路径
在这里插入图片描述

自动配置实战

所以,了解了自动配置的原理,来自己实现一个自动配置的玩意其实很简单。

添加配置类:

    import org.slf4j.Logger;

    import org.springframework.context.EnvironmentAware;

    import org.springframework.core.env.Environment;

    import com.oceanpayment.common.utils.logger.LoggerUtils;

    public class EnvConfig implements EnvironmentAware {
   

        private final Logger logger = LoggerUtils.getLogger(this);

        private Environment env;

        public String getStringValue(String key) {
   

            return env.getProperty(key);

        }

        public Long getLongValue(String key) {
   

            String value = getStringValue(key);

            try {
   

                return Long.parseLong(value);

            } catch (Exception e) {
   

                logger.error("字符串转换Long失败:{} = {}", key, value);

            }

            return 0L;

        }

        public int getIntValue(String key
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月常新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值