千家信息网

SpringBoot 05自动配置原理是什么

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,SpringBoot 05自动配置原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。自动配置原理配置文件到底能写什么?怎么写?
千家信息网最后更新 2024年12月12日SpringBoot 05自动配置原理是什么

SpringBoot 05自动配置原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

自动配置原理

配置文件到底能写什么?怎么写?SpringBoot官方文档中有大量的配置,我们无法全部记住,具体位置找官网即可。问题是底层是怎么搞实现的我们需要搞一搞了解下。

分析自动配置原理

我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;@Configuration //启动指定类的ConfigurationProperties功能;  //进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;  //并把HttpProperties加入到ioc容器中@EnableConfigurationProperties({HttpProperties.class}) //Spring底层@Conditional注解  //根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;  //这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效@ConditionalOnWebApplication(    type = Type.SERVLET)//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;@ConditionalOnClass({CharacterEncodingFilter.class})//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;  //如果不存在,判断也是成立的  //即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;@ConditionalOnProperty(    prefix = "spring.http.encoding",    value = {"enabled"},    matchIfMissing = true)public class HttpEncodingAutoConfiguration {    //他已经和SpringBoot的配置文件映射了    private final Encoding properties;    //只有一个有参构造器的情况下,参数的值就会从容器中拿    public HttpEncodingAutoConfiguration(HttpProperties properties) {        this.properties = properties.getEncoding();    }        //给容器中添加一个组件,这个组件的某些值需要从properties中获取    @Bean    @ConditionalOnMissingBean //判断容器没有这个组件?    public CharacterEncodingFilter characterEncodingFilter() {        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();        filter.setEncoding(this.properties.getCharset().name());        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));        return filter;    }    //。。。。。。。}

@EnableConfigurationProperties 注解

先说作用:

@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。

说明:

如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。
测试发现 @ConfigurationProperties 与 @EnableConfigurationProperties 关系特别大。

测试证明:@ConfigurationProperties@EnableConfigurationProperties 的关系。

@EnableConfigurationProperties 文档中解释:
@EnableConfigurationProperties注解应用到你的@Configuration时, 任何被@ConfigurationProperties注解的beans将自动被Environment属性配置。 这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。

测试发现:
1.使用 @EnableConfigurationProperties 进行注册

@ConfigurationProperties(prefix = "service.properties")public class HelloServiceProperties {    private static final String SERVICE_NAME = "test-service";    private String msg = SERVICE_NAME;       set/get}@Configuration@EnableConfigurationProperties(HelloServiceProperties.class)@ConditionalOnClass(HelloService.class)@ConditionalOnProperty(prefix = "hello", value = "enable", matchIfMissing = true)public class HelloServiceAutoConfiguration {}@RestControllerpublic class ConfigurationPropertiesController {    @Autowired    private HelloServiceProperties helloServiceProperties;    @RequestMapping("/getObjectProperties")    public Object getObjectProperties () {        System.out.println(helloServiceProperties.getMsg());        return myConfigTest.getProperties();    }}

自动配置设置

service.properties.name=my-test-nameservice.properties.ip=192.168.1.1service.user=kayleservice.port=8080

一切正常,但是 HelloServiceAutoConfiguration 头部不使用 @EnableConfigurationProperties,测访问报错。

2.不使用 @EnableConfigurationProperties 进行注册,使用 @Component 注册

@ConfigurationProperties(prefix = "service.properties")@Componentpublic class HelloServiceProperties {    private static final String SERVICE_NAME = "test-service";    private String msg = SERVICE_NAME;    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }}

Controller 不变,一切正常,如果注释掉 @Component 测启动报错。
由此证明,两种方式都是将被 @ConfigurationProperties 修饰的类,加载到 Spring Env 中。

一句话总结 配置原理:

根据当前不同的条件判断,决定这个配置类是否生效!

  • 一但这个配置类生效;这个配置类就会给容器中添加各种组件;

  • 这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;

  • 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;

  • 配置文件能配置什么就可以参照某个功能对应的这个属性类

    //从配置文件中获取指定的值和bean的属性进行绑定@ConfigurationProperties(prefix = "spring.http") public class HttpProperties {    // .....}


    我们去配置文件里面试试前缀,看提示!

这就是自动装配的原理!

精髓

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

5、xxxxAutoConfigurartion:自动配置类;给容器中添加组件

6、xxxxProperties:封装配置文件中相关属性;

@Conditional

了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效;

@Conditional派生注解(Spring注解版原生的@Conditional作用)

作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。

我们怎么知道哪些自动配置类生效?

我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

#开启springboot的调试类debug=true
============================CONDITIONS EVALUATION REPORT============================Positive matches: (自动配置类启用的:正匹配)-----------------   AopAutoConfiguration matched:      - @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)     ...Negative matches:  (没有启动,没有匹配成功的自动配置类:负匹配)-----------------   ActiveMQAutoConfiguration:      Did not match:         - @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)     .....Exclusions:-----------    NoneUnconditional classes: (没有条件的类)----------------------    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration    org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration

关于SpringBoot 05自动配置原理是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

配置 文件 组件 容器 属性 注解 原理 条件 问题 作用 功能 应用 测试 不同 内容 就是 底层 文档 更多 分析 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎样修改数据库中的内容 数据库属性的次序不可调整 网络安全教育工程本科入学考试 数据库题库管理系统课程设计 湖南软件开发申请补贴 网络安全网站开发 哪儿 有关于软件开发的书 狼狼爱房网络技术有限公司 derby数据库管理工具 直播服务器多大合适 苏州免费客户管理软件开发 怎么将文件传入数据库 关于网络安全的短语50字 我的世界暗之楼服务器客户端 昆山 服务器托管 团贷网互联网科技 营销数据库文件错误要修复吗 医院网络安全周期性巡查报告 秒表软件开发流程图 天长哪块有软件开发公司 在网络安全构建策略上 数据库设计简答题 怎样使用数据库的语言 华硕 服务器主板 开机跳线 网络安全机制包括安全监视和 生产服务器风扇的厂家有哪些 mfc调用数据库 如何认识新时代下的国家网络安全 数据库统计每个人的总分 软件开发测试性格不合
0