SpringBoot自定义starter
springBoot自定义starter可以实现以前的spring和各种第三方插件的整合过程,对于动态的数据只需要从application.properties中配置即可,不需要像原来的那样需要配置大量的xml整合文件
关键点
- 创建一个普通的maven工程引入一下jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId> <version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId> <version>2.0.0.RELEASE</version>
<optional>true</optional>
</dependency>
或者创建一个springboot工程
-
编写一个XXXAutoConfiguration,配置注解 @Configuration,配置一个@Bean 作为提供spring容器注入方法入口,在此方法中可以将第三方的插件注入到spring容器中,同时可以
1. 配合@EnableConfigurationProperties(XXX.class)注解完成动态参数通过application.properties文件配置的方式注入
2. 配合@ConditionalOnXXX的方式让该注解在指定的条件下生效3. 在类路径下,创建META-INF文件夹,在META-INF文件件下创建 spring.factories 文件 在spring.factories 文件中配置 org.springframework.boot.autoconfigure.EnableAutoConfiguration=XXXAutoConfiguration全路径名
- 打包并部署idea中可以
在这里插入图片描述
eclipse中可以
-
其他springBoot工程引用并测试
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestStarterApplication.class)
public class TestStarterApplicationTests {
@Autowired
TecherService techerservice;
@Test
public void contextLoads() {
TestTcherService service = new TestTcherService();
service.fun();
techerservice.sayhello();
}
}
-
总结
-
你使用过springBoot的自定义插件吗?,能说一下原理吗
–其实springBoot的自定义插件使用了Java的SPI技术,这种技术本质上是对双亲委派机制,核心类加载器( Bootstrap ClassLoader )无法加载实现类(由 Application ClassLoader 加载的类,一般是我们自己创建的类)的这种缺点的一种补充实现,实现方式上是在 META-INF\services 下创建以 核心类中定义的接口的全类名为文件名的以个文件,然后在这个文件中配置所有实现类的全类名
-
最后通过ServiceLoader 加载所有实现了指定接口的实现类
public static void main(String[] args){
//通过 ServiceLoader 类加载 TestFun 的所有实现类
ServiceLoader<TestFun> s = ServiceLoader.load(TestFun.class); Iterator<TestFun> searchList = s.iterator();
while (searchList.hasNext()) {
TestFun curSearch = searchList.next();
curSearch.fun(); //调用所有实现类的接口方法
}
}
再看springBoot中是通过 EnableAutoConfiguration 中注入的 META-INF/spring.facteries文件,我们是如何知道这个的呢?看源码!
-
首先从主启动类的@SpringBootApplication 注解入手
-
查看复核注解@SpringBootApplication的 @EnableAutoConfiguration
-
查看 AutoConfigurationImportSelector类 在 @Import(AutoConfigurationImportSelector.class) 中
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
}
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}