SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)

栏目: Java · 发布时间: 7年前

内容简介:springBoot为我们提供了自动化装配的功能,简单方便。可以像使用插件一样,对各个组件自由组合装配。只需引入定义好的 starter 即可。有点类似于java的SPI机制,只不过SPI机制是为了解决项目与项目之间的解耦,而starter方式实现了模块化完全解耦,实现热插拔功能。今天就来自定义一个自动化装配的实现,自定义starter。如图所示:

springBoot为我们提供了自动化装配的功能,简单方便。可以像使用插件一样,对各个组件自由组合装配。只需引入定义好的 starter 即可。有点类似于 java 的SPI机制,只不过SPI机制是为了解决项目与项目之间的解耦,而starter方式实现了模块化完全解耦,实现热插拔功能。

今天就来自定义一个自动化装配的实现,自定义starter。

自定义starter

首先定义一个配置类模块:

/**
 * Created by zhangshukang on 2018/9/20.
 */

@Configuration
@ConditionalOnProperty(name = "enabled.autoConfituration", matchIfMissing = true)
public class MyAutoConfiguration {

    static {
        System.out.println("myAutoConfiguration init...");
    }

    @Bean
    public SimpleBean simpleBean(){
        return new SimpleBean();
    }

}
复制代码

然后定义一个starter模块,里面无需任何代码,pom也无需任何依赖,只需在META-INF下面建一个 spring.factories文件,添加如下配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
spring.study.startup.bean.MyAutoConfiguration
复制代码

如图所示:

SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
最后只需在启动类项目中引入我们的 starter 模块即可。

原理

SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三) 中,我们提到了自动化配置的逻辑,入口为spring 刷新容器的方法:

public void refresh() throws BeansException, IllegalStateException {
		//...
		invokeBeanFactoryPostProcessors(beanFactory);
		//...
	}
复制代码

最终在 AutoConfigurationImportSelector 解析 spring.factories 文件:

SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)
spring.factories

默认的配置类。如下:

SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)

springBoot为我们提供的配置类有180多个,但是我们不可能会全部引入。所以在自动装配的时候,会去classPath下面寻找,是否有对应的配置类。如果有配置类,则按条件注解 @Conditional 或者 @ConditionalOnProperty 等相关注解进行判断,决定是否需要装配。如果 classPath 下面没有对应的字节码,则不进行任何处理。 我们自定义的配置类也是以相同的逻辑进行装配,我们指定了以下注解:

@ConditionalOnProperty(name = "enabled.autoConfituration", matchIfMissing = true)
复制代码

默认为 true,所以自定义的starter成功执行。

springBoot 提供了一系列的条件注解:

@ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean) @ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean) @ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean) @ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean) @ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean) @ConditionalOnNotWebApplication(不是web应用)

后面会进行条件注解源码分析。

SpringBoot2 | SpringBoot启动流程源码分析(一)

SpringBoot2 | SpringBoot启动流程源码分析(二)

SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)

SpringBoot2 | SpringBoot Environment源码分析(四)

SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)

SpringBoot2 | SpringBoot监听器源码分析 | 自定义ApplicationListener(六)

SpringBoot2 | 条件注解@ConditionalOnBean原理源码深度解析(七)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Bulletproof Web Design

Bulletproof Web Design

Dan Cederholm / New Riders Press / 28 July, 2005 / $39.99

No matter how visually appealing or packed with content a Web site is, it isn't succeeding if it's not reaching the widest possible audience. Designers who get this guide can be assured their Web site......一起来看看 《Bulletproof Web Design》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换