峰哥说技术: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 中注入的值,如下

扫描二维码关注公众号,回复: 9521094 查看本文章

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/.对于文章中的内容,峰哥会陆续开始免费的公开课。

猜你喜欢

转载自www.cnblogs.com/027kgc/p/12393825.html