SpringBoot自定义starter原理

SpringBoot自定义starter

​ springBoot自定义starter可以实现以前的spring和各种第三方插件的整合过程,对于动态的数据只需要从application.properties中配置即可,不需要像原来的那样需要配置大量的xml整合文件

关键点

  1. 创建一个普通的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工程

  1. 编写一个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全路径名
    

在这里插入图片描述

  1. 打包并部署idea中可以
    在这里插入图片描述

在这里插入图片描述
eclipse中可以

在这里插入图片描述

  1. 其他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();
}

}

  1. 总结

    • 你使用过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文件,我们是如何知道这个的呢?看源码!

  1. 首先从主启动类的@SpringBootApplication 注解入手

  2. 查看复核注解@SpringBootApplication的 @EnableAutoConfiguration

  3. 查看 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;
   	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值