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

a063c534528a36a1437a361a709b6743.png

大家好,今天的技术贴主题

手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

Spring Boot中的启动器是如何启动的,很多人都对这个问题搞不清楚。今天峰哥带着大家通过自定义一个启动器,可以很容易的看懂Spring Boot是怎么样自动配置的。下面我们通过一个案例来说明这个问题。

步骤如下

01步骤

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

ca22074b0ae588469829f0143687e166.png

1b95d421594eb60bc81eba356dffb2ed.png

f2ffe59044e7b53fa7c12828e7c5b9db.png

02步骤

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

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-autoconfigure</artifactId>

<version>2.2.4.RELEASE</version>

</dependency>

</dependencies>

03步骤

配置完成后,首先创建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,让属性值为这两个。类上的注解我们前面学过,应该也不陌生。

04步骤

创建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省略...

}

05步骤

编写自动配置类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;

}

}

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

  1. @Configuration表明这是一个配置配。
  2. @EnableConfigurationProperties(HelloProperties.class)表示自动配置属性类,让HelloProperties类的属性进入Spring的Bean中。
  3. @ConditionalOnClass(HelloService.class):这个注解是Conditional注解的子注解,意思是表示当项目当前 classpath 下存在如果HelloService类存在,后面的配置才生效,这个原理就是我们前面讲解的条件注解,大家可以回忆一下条件注解的用法。

06步骤

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

5db7b5cac4019e9b86644d08ca777f5a.png

07步骤

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

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

application.yml

spring:

profiles:

active: dev

---

server:

port: 8083

author:

name: 老大

age: 56

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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值