- starter是SpringBoot的核心组成部分,在starter中springboot为我们提供了很多的默认封装,同时提供了可扩展性的节点。我们在使用的时候,可以使用默认的封装,或者在application.properties配置文件中自己定义,这样就能实现灵活的运用,接下来我们就来自定义starter并且通过spring-boot-autoconfigure完成自动化配置。
- 先熟悉springboot提供的一些列条件注解:
@ConditionalOnBean:当SpringIoc容器内存在指定Bean的条件
@ConditionalOnClass:当SpringIoc容器内存在指定Class的条件
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在时查找指定的位置
@ConditionalOnMissingBean:当SpringIoc容器内不存在指定Bean的条件
@ConditionalOnMissingClass:当SpringIoc容器内不存在指定Class的条件
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnSingleCandidate:当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication:当前项目是Web项目的条件
一、创建maven项目导入自动配置依赖
- 这里只是添加了spring-boot-autoconfigure,可以根据自己封装的业务内容进行添加
<?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.qiu</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
二、自定义业务所需要的默认操作
- @ConfigurationProperties注解内我们使用到了属性preffix,该属性配置了读取参数的前缀,根据上面的实体属性对应配置文件内的配置则是hello.message、hello.show,当然我们提供了默认值,配置文件内不进行配置时则是使用默认值。
//配置默认的参数实体类
@ConfigurationProperties(prefix = "hello")
public class HelloProperties {
//消息内容
private String message = "hello world";
//是否显示消息内容
private boolean show = true;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public boolean isShow() {
return show;
}
public void setShow(boolean show) {
this.show = show;
}
}
三、编写自定义的业务
//自定义的业务类
public class HelloService {
//消息内容
private String message;
//是否显示消息内容
private boolean show ;
public String sayHello()
{
return show ? "Hello," + message : "Hidden";
}
public void setMessage(String message) {
this.message = message;
}
public void setShow(boolean show) {
this.show = show;
}
}
四、自定义starter自动化配置
@Configuration//开启配置
@EnableConfigurationProperties(HelloProperties.class)//开启使用映射实体对象
@ConditionalOnClass(HelloService.class)//存在HelloService时初始化该配置类
public class HelloAutoConfiguration {
//application.properties配置文件映射前缀实体对象
@Autowired
private HelloProperties helloProperties;
/**
* 根据条件判断不存在HelloService时初始化新bean到SpringIoc
* @return
*/
@Bean//创建HelloService实体bean
@ConditionalOnMissingBean(HelloService.class)//缺失HelloService实体bean时,初始化HelloService并添加到SpringIoc
public HelloService helloService()
{
System.out.println(">>>The HelloService Not Found,Execute Create New Bean.");
HelloService helloService = new HelloService();
helloService.setMessage(helloProperties.getMessage());//设置消息内容
helloService.setShow(helloProperties.isShow());//设置是否显示
return helloService;
}
}
五、自定义spring.factories
- 在src/main/resource目录下创建META-INF目录,并在目录内添加文件spring.factories
//配置自定义Starter的自动化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.qiu.hello.HelloAutoConfiguration
六、另一个项目中进行测试
- 先进行打包:步骤:工具右侧 -> Maven Projects -> Lifecycle -> install,然后在另一个项目中引入
<!--自定义starter依赖-->
<dependency>
<groupId>com.qiu</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
-
开启项目
- 自测:
@RestController
public class HelloController
{
//注入自定义starter内逻辑
@Autowired
HelloService helloService;
/**
* 测试访问地址/hello
* @return 格式化字符串
*/
@RequestMapping(value = "/hello")
public String sayHello()
{
return helloService.sayHello();
}
}
返回:Hello,hello world
- 在applicationh.properties配置文件中配置后再进行测试
参考:https://blog.csdn.net/weixin_42033269/article/details/80026078?utm_source=blogxgwz0