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

微信公众号:吉姆餐厅ak 学习更多源码知识,欢迎关注。 java

在这里插入图片描述


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

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

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

SpringBoot2 | SpringBoot Environment源码分析(四)微信

SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五)模块化

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

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

SpringBoot2 | Spring AOP 原理源码深度剖析(八)ui

SpringBoot2 | SpingBoot FilterRegistrationBean 注册组件 | FilterChain 责任链源码分析(九)spa

SpringBoot2 | BeanDefinition 注册核心类 ImportBeanDefinitionRegistrar (十)

SpringBoot2 | Spring 核心扩展接口 | 核心扩展方法总结(十一)


概述

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
复制代码

如图所示:

在这里插入图片描述
最后只需在启动类项目中引入咱们的 starter 模块便可。


原理

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

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

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

在这里插入图片描述
spring.factories默认的配置类。以下:
在这里插入图片描述

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原理源码深度解析(七)

相关文章
相关标签/搜索