• 峰哥说技术:06手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理


    Spring Boot深度课程系列

    峰哥说技术—2020庚子年重磅推出、战胜病毒、我们在行动

    06  峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

    Spring Boot中的启动器是如何启动的,很多人都对这个问题搞不清楚。今天峰哥带着大家

    通过自定义一个启动器,可以很容易的看懂Spring Boot是怎么样自动配置的。下面我们通过一个案例来说明这个问题。步骤如下

    A)新建一个普通的Maven项目,关键部分截图如下。

     

    B)在工程的pom.xml文件中添加Spring boot自动化配置依赖,其他的部分无需修改

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
    </dependencies>

    C)配置完成后,我们首先创建一个 HelloProperties 类,用来接受 application.properties 中注入的值,如下

    package com.java;
    @ConfigurationProperties(prefix = "author")
    public class HelloProperties {
        private static String DEFAULT_NAME="罗贯中";
        private static Integer DEFAULT_AGE=34;
        private String name=DEFAULT_NAME;
        private Integer age=DEFAULT_AGE;  
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Integer getAge() {
            return age;
        }
        public void setAge(Integer age) {
            this.age = age;
        }
    }

    该配置类很好理解,我们在后面新建一个工程,可以根据需要,通过application.properties将我们自已配置的属性值注入到name和age中。如果没有注入就会使用默认的值“罗贯中”和34,让属性值为这两个。类上的注解我们前面学过,应该也不陌生。

    D)创建一个service包,创建业务类HelloService.功能非常简单,就是一个输出name和age的功能。编码如下:

    package com.java.service;

    public class HelloService {
        private String name;
        private Integer age;

        public String sayHello(){
            return name+"的年龄是:"+age;
        }
        //getter和setter省略...
        }

    E)编写自动配置类HelloServiceAutoConfiguration,先写代码。然后后面进行解释说明。

    package com.java.configuration;

    import com.java.HelloProperties;
    import com.java.service.HelloService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    @EnableConfigurationProperties(HelloProperties.class)
    @ConditionalOnClass(HelloService.class)
    public class HelloServiceAutoConfiguration {
        @Autowired
        private HelloProperties helloProperties;
        @Bean
        HelloService helloService(){
            HelloService helloService=new HelloService();
            helloService.setName(helloProperties.getName());
            helloService.setAge(helloProperties.getAge());
            return helloService;
        }
    }

    对自动配置类的注解进行解释说明:

    l @Configuration表明这是一个配置配。

    l @EnableConfigurationProperties(HelloProperties.class)表示自动配置属性类,让HelloProperties类的属性进入Spring的Bean中。

    l @ConditionalOnClassHelloService.class):这个注解是Conditional注解的子注解,意思是示当项目当前 classpath 下存在如果HelloService类存在,后面的配置才生效,这个原理就是我们前面讲解的条件注解,大家可以回忆一下条件注解的用法。

    E)创建资源文件夹,在resources文件夹下面创建META-INF文件夹,然后创建spring.factories文件。其实这个我们可以随便参考一个启动器,就能很清楚的知道。

     

    Spring.factories的内容如下:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.java.configuration.HelloServiceAutoConfiguration

    F)打包到本地仓库供我们使用,在第一个工程chapter01中添加如下依赖,并在HelloController中添加测试方法。代码如下:

    G)修改application.yml,然后对author进行属性配置。再次进行测试,最后结果如下:

    l application.yml

    spring:
      profiles:
        active: dev
    ---
    server:
      port: 8083
    author:
      name: 老大
      age: 56

    l pom.xml添加依赖

    <dependency>
        <groupId>com.java</groupId>
        <artifactId>HelloWorldStarter</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    HelloController类添加如下代码

    @RestController
    public class HelloController {
        @Autowired
        private HelloService helloService;
        @GetMapping("/test")
        public String test(){
            return helloService.sayHello();
        }
    }

    在浏览器输入:http://localhost:8083/test

     

    问题:清说明Spring boot自动配置的原理?

    Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

    大家可以动手写一下,无需半个小时。峰哥会按照一定的节奏,在公众号发布,同时大家也可以关注我在博客园中的专栏https://www.cnblogs.com/027kgc/.对于文章中的内容,峰哥会陆续开始免费的公开课。

  • 相关阅读:
    javascript中createTextRange用法[转]
    在服务器端在线解压.ZIP文件的小工具(源码打包)以后向服务器发布程序就快了。
    关于extjs和coolite 收费以及版权的问题 请大家帮帮解释解释。
    关于目前千团大战与我的一些事情
    C#实现做秒杀器系列之一 网站登录
    CLR的执行模型 清晰明了
    socket 实现淘宝秒杀器(抢拍器) 附源码与截图
    MIME生成EXCEL 包括图片的写入 支持EXCEL2003 2007 草稿
    给WPF Browser Application创建数字证书(转)
    C#自动注册sqlite ado.net数据库驱动 及 自定义连接字符串
  • 原文地址:https://www.cnblogs.com/027kgc/p/12393825.html
Copyright © 2020-2023  润新知