Springboot 思想
根据springboot 的思想,当我们需要某个功能的时候,我们可以导入相关的依赖,比如我们需要web的时候,我们导入spring-boot-starter-web
当我们需要整合 mybatis 的时候,我们导入
mybatis-spring-boot-starter
依赖, 然后springboot 就会为我们自动创建相关的组件,
- 其中 spring-boot-starter-xxxx 是springboot自己整合的。
- xxx-spring-boot-starter 是别去整合 spirngboot的
自定义starter
分析
我们来参考 mybatis-spring-boot-starter 可以写出我们自己的 starter ,
分析 mybatis-spring-boot-starter 可以得知
启动器只用来做依赖导入,没有任何代码
依赖的mybatis-spring-boot-autoconfigure 才是真正实现自动配置的
自定义思路:
- 我们可以先写一个 xxx-spring-boot-starter 工程 里面只有依赖,没有代码
- 我们写一个 xxx-spring-boot-autoconfigure 来实现我们真正的 自动配置
自定义 starter 我们需要了解以下内容
@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,\
自定义starte实现
期待功能
我来来实现一个自定义的starter ,只要在工程中引入我们自己的 starter ,就会往容器自动注入我们自己配置的类,而且可以在springboot的 yml配置文件中自动加载 我们所配置的内容
实现
- 定义
fyj-spring-boot-starter
工程,该工程只有 pom依赖
没有任何代码和配置
<dependencies>
<dependency>
<groupId>com.yajun</groupId>
<artifactId>fyj-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
-
定义
fyj-spring-boot-autoconfigure
工程
工程结构如下:
FyjAutoConfiguration 是配置类@Configuration @EnableConfigurationProperties({FyjProperties.class}) public class FyjAutoConfiguration { @Autowired FyjProperties fyjProperties; @Bean public HelloService helloService(FyjProperties fyjProperties) { HelloService helloService = new HelloService(); helloService.setFyjProperties(fyjProperties); return helloService; } }
FyjProperties 是对应的属性注入类,它可以自动从yml配置文件中读取配置
@ConfigurationProperties(prefix = "fyj") public class FyjProperties { private String pre; private String post; public String getPre() { return pre; } public void setPre(String pre) { this.pre = pre; } public String getPost() { return post; } public void setPost(String post) { this.post = post; } }
功能类,
public class HelloService { private FyjProperties fyjProperties; public String sayHelloFyj(String name) { return fyjProperties.getPre() + "->"+ name + "->" + fyjProperties.getPost(); } public FyjProperties getFyjProperties() { return fyjProperties; } public void setFyjProperties(FyjProperties fyjProperties) { this.fyjProperties = fyjProperties; } }
spring.factories文件,springboot 启动的时候会加载里面的 EnableAutoConfiguration对应的属性
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.yajun.springboot.autoconfigure.FyjAutoConfiguration
pom 依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
-
测试
我们定义一个工程 pom 依赖导入我们自定义的 fyj-spring-boot-starter<dependency> <artifactId>fyj-spring-boot-starter</artifactId> <groupId>com.yajun</groupId> <version>0.0.1-SNAPSHOT</version> </dependency>
yml 配置文件 配置属性
fyj: pre: pre post: post
测试类:
@SpringBootTest class SpringbootMytatisApplicationTests { @Autowired private HelloService helloService; @Test void contextLoads() { String fangyajun = helloService.sayHelloFyj("你好"); System.out.println(fangyajun); } }
运行结果:
从结果可以看出 ,我们可以自动注入 HelloService 这个我们自己定义的组件,而且 可以从yml配置文件中读取我们的配置,
已经完成了fyj-spring-boot-starter