编写自己的Spring Boot Starter

基本步骤

  • 引入对应的依赖
  • 编写实现类
  • 编写配置文件读取类,主要注解是@ConfigurationProperties(配置的值例如a.b)
  • 编写自动装配类
  • 编写默认的配置文件resources/META-INF/spring.factories

resources/META-INF/spring.factories中配置我们的自动装配类

具体编码

引入的依赖

1
2
3
4
5
6
7
8
9
10
11
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
</dependencies>

说明:

  • 第一个依赖 主要是为编译器配置的,可以根据ymlproperties配置项鼠标右键,点到使用这个属性的类上
  • 第二个依赖 主要是为了自动装配

编写自己的功能实现类

为了说明问题 实现类的作用就是返回配置字符串的hashcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package cn.appblog;

/**
* 目标功能实现类
*/
public class HashCodeClient {
private String target;

public HashCodeClient(String target){
this.target = target;
}

public String getHashCode() {
return String.valueOf(this.target.hashCode());
}
}

编写配置文件读取类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package cn.appblog;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("cn.appblog")
public class HashCodeProperties {

private String target;

public String getTarget() {
return target;
}

public void setTarget(String target) {
this.target = target;
}
}

这里我们要读取的配置就是cn.appblog.target的值,@ConfigurationProperties注解的作用就是读取配置文件指定属性的值

编写自动装配类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package cn.appblog;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(HashCodeProperties.class)
@ConditionalOnClass(HashCodeClient.class)
public class HashCodeAutoConfigrution {

@Autowired
private HashCodeProperties hashCodeProperties;

@ConditionalOnMissingBean
@Bean
public HashCodeClient getHashCodeClient(){
return new HashCodeClient(hashCodeProperties.getTarget());
}
}

@Configuration

标识本类是配置类(相当于spring中application.xml)

@EnableConfigurationProperties(HashCodeProperties.class)

如果HashCodeProperties中有注解@ConfigurationProperties那么这个类就会被加到spring上下文的容器中,也就是可以通过@Autowire来注入

@ConditionalOnClass

当类路径下有指定类的情况下才进行下一步

@ConditionalOnMissingBean

当spring容器中没有这个Bean时才进行下一步

设置自动加载的配置文件spring.factories

resources/META-INF下添加spring.factories指定自动装配的类也叫入口,内容如下:

1
2
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
cn.appblog.HashCodeAutoConfigrution

添加我们的默认配置

application.yml中添加下面

1
2
3
cn:
appblog:
target: www.appblog.cn

这就有了默认值

发布本地仓库或部署私有仓库

通过maven install命令发布在本地,然后在其他项目引入这个jar依赖,测试时直接自动注入我们的bean即可

测试是否成功

新建Spring Boot工程,引入依赖

1
2
3
4
5
6
<!--引入自定义的starter-->
<dependency>
<groupId>com.test.springboot</groupId>
<artifactId>myself-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>

直接进行单元测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package cn.appblog.test;

import cn.appblog.HashCodeClient;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

import java.util.HashMap;
import java.util.Map;

import static org.junit.Assert.*;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class ControllerTest {

@Autowired
private HashCodeClient hashCodeClient;

@Test
public void testStarter(){
System.out.println(hashCodeClient.getHashCode());
}
}

运行成功获取hashCode

application.yml中覆盖原来的属性

1
2
3
cn:
appblog:
target: test

测试得hashCode不一致,证明成功

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2021 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :