1.自定义starter需要注意的两个问题
- 这个场景需要使用的依赖是什么
- 如何编写自动配置
结合SpringBoot自动配置的经验大致要做的事情有下面这些:
@Configuration //指定这个类是一个配置类
@ConditionalOnXXX //在指定条件成立的情况下自动配置类生效
@AutoConfigureAfter //指定自动配置类的顺序
@Bean //给容器中添加组件
@ConfigurationPropertie结合相关xxxProperties类来绑定相关的配置
@EnableConfigurationProperties //让xxxProperties生效加入到容器中
自动配置类要能加载
将需要启动就加载的自动配置类,配置在META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,
2.模式
启动器只用来做依赖导入
专门来写一个自动配置模块
启动器依赖自动配置模块,别人只需要引入启动器(starter)
- 命令规则:
-
官方命名
- 前缀:”spring-boot-starter-”
- 模式:spring-boot-starter-模块名
- 举例:spring-boot-starter-web、spring-boot-starter-jdbc
-
自定义命名
-
后缀:”-spring-boot-starter”
-
模式:模块名-spring-boot-starter
-
举例:mybatis-spring-boot-starter
-
-
3.自定义starter
-
首先建立两个项目,
一个做启动器,什么都不写,只导入关于配置组件的依赖
另一个项目做配置模块
(1)创建一个空工程
(2) 在空工程创建一个maven工程作为启动器
(3)再创建一个spring Initializr作自动配置,不选取任何starter直接创建
(4)选中应用后点击ok -
启动器:
只需要在第一个项目中的pom.xml文件中引入配置组件的依赖即可,同时删掉build跟test依赖。其他的任何操作都不需要<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.itstudy.starter</groupId> <artifactId>itstudy-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- 引入自动配置模块 --> <dependency> <groupId>com.itstudy.starter</groupId> <artifactId>itstudy-spring-boot-starter-autoconfigure</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
3.配置模块
(1)首先在pom.xml中引入springboot的starter,这是所有的starter的基本配置
<dependencies>
<!-- 引入springboot的starter:所有starter的基本配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
(2)然后创建一个xxxProperties类用来放配置参数
@ConfigurationProperties(prefix = "itstudy.hello")
public class HelloProperties {
private String prefix;
private String surfix;
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getSurfix() {
return surfix;
}
public void setSurfix(String surfix) {
this.surfix = surfix;
}
}
(3)然后创建xxxAutoConfiguration用作自动配置类,并自动配置刚刚的xxxProperties类,并给xxxService设置上导入的xxxProperties类
@Configuration
@ConditionalOnWebApplication // web应用才生效
@EnableConfigurationProperties(HelloProperties.class) // 让这个属性文件生效
public class HelloServiceAutoConfiguration {
@Autowired
HelloProperties helloProperties;
@Bean
public HelloService helloService(){
HelloService helloService = new HelloService();
helloService.setHelloProperties(helloProperties);
return helloService;
}
}
(4)创建xxxService类用作业务实现类
public class HelloService {
HelloProperties helloProperties;
public String sayHello(String name){
return helloProperties.getPrefix() + "-" + name + "-" + helloProperties.getSurfix();
}
public HelloProperties getHelloProperties() {
return helloProperties;
}
public void setHelloProperties(HelloProperties helloProperties) {
this.helloProperties = helloProperties;
}
}
(5)在resources下创建META-INF目录,并创建spring.factories,并配置刚刚的xxxAutoConfiguration类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.itstudy.starter.HelloServiceAutoConfiguration
(6)将两个包安装到Maven仓库即可
4.测试starter
-
创建一个新项目,导入依赖
<dependency> <groupId>com.itstudy.starter</groupId> <artifactId>itstudy-spring-boot-starter</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
-
使用starter中的xxxService
@RestController public class HelloController { @Autowired HelloService helloService; @GetMapping("/hello") public String hello(){ return helloService.sayHello("hahahaha"); } }
-
在配置文件中设置xxxProperties的参数
itstudy.hello.prefix=A itstudy.hello.surfix=B