Spring Boot 自动配置
Spring Boot的自动配置功能会根据Classpath中的Class为我们自动创建相应的bean。比如当classpath下存在MongoClient.class和MongoTemplate.class时就会进行Spring Data MongoDB的配置。这是通过MongoDataAutoConfiguration类配置的。下面是MongoDataAutoConfiguration类的定义,可以看到上面使用了@Configuration
注解定义,且通过@ConditionalOnClass
注解指定了只有在存在MongoClient.class和MongoTemplate.class时才会生效。@EnableConfigurationProperties
指定了可以使用的配置属性类,Spring Boot会自动生成对应类型的bean,以供我们在自动配置类中进行依赖注入。@AutoConfigureAfter
定义了该自动配置类生效的位置,下面代码指定了将在MongoAutoConfiguration
配置类之后生效。
@Configuration
@ConditionalOnClass({ MongoClient.class, MongoTemplate.class })
@EnableConfigurationProperties(MongoProperties.class)
@AutoConfigureAfter(MongoAutoConfiguration.class)
public class MongoDataAutoConfiguration {
//...省略
}
上面的配置类又定义了很多的bean,如下是简单的两个示例。其中通过 @ConditionalOnMissingBean(MongoDbFactory.class)
指定了在没有定义MongoDbFactory类型的bean时将通过mongoDbFactory()
创建一个类型为SimpleMongoDbFactory的bean。指定了在不存在MongoTemplate类型的bean时将通过mongoTemplate()
创建一个MongoTemplate类型的bean(@ConditionalOnMissingBean
不指定类型时,默认取方法返回类型)。
@Configuration
@ConditionalOnClass({ MongoClient.class, MongoTemplate.class })
@EnableConfigurationProperties(MongoProperties.class)
@AutoConfigureAfter(MongoAutoConfiguration.class)
public class MongoDataAutoConfiguration {
private final ApplicationContext applicationContext;
private final MongoProperties properties;
public MongoDataAutoConfiguration(ApplicationContext applicationContext,
MongoProperties properties) {
this.applicationContext = applicationContext;
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean(MongoDbFactory.class)
public SimpleMongoDbFactory mongoDbFactory(MongoClient mongo) {
String database = this.properties.getMongoClientDatabase();
return new SimpleMongoDbFactory(mongo, database);
}
@Bean
@ConditionalOnMissingBean
public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory,
MongoConverter converter) {
return new MongoTemplate(mongoDbFactory, converter);
}
//...省略
}
@ConditionalOnMissingBean
除了可以通过类型指定缺失的bean外,还可以通过bean名称指定缺失的bean。 除了上面提到的Conditional注解外,Spring Boot还提供了很多Conditional注解,它们都定义在org.springframework.boot.autoconfigure.condition
包中,详情可以参考对应的API文档。
上面是基于MongoDataAutoConfiguration自动配置类举的一个例子,其它自动配置类也是采用类似的形式进行定义的,它们都定义在spring-boot-autoconfigure-xxx.jar
中。通过上面的介绍我们知道,如果我们不想使用自动配置的bean,则可以定义自己的bean。这样自动配置的bean就不会生效了。自动配置的bean生效的条件是多种多样的,具体可以参考对应的AutoConfiguration类。
如果不想使用某个自动配置,则可以通过@SpringBootApplication
的exclude属性指定需要排除的自动配置类。如下代码就指定了将排除MongoDataAutoConfiguration自动配置类。
@SpringBootApplication(exclude = { MongoDataAutoConfiguration.class })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
也可以通过excludeName指定需要排除的自动配置类的全路径名称。
@SpringBootApplication(excludeName = { "org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration" })
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
如果期望看到哪些自动配置类进行了自动配置,可以在启动参数中添加--debug
,则日志中会输出自动配置结果,类似于下面这样的。
============================
CONDITIONS EVALUATION REPORT
============================
Positive matches:
-----------------
AopAutoConfiguration matched:
- @ConditionalOnClass found required classes 'org.springframework.context.annotation.EnableAspectJAutoProxy', 'org.aspectj.lang.annotation.Aspect', 'org.aspectj.lang.reflect.Advice', 'org.aspectj.weaver.AnnotatedElement'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)
AopAutoConfiguration.CglibAutoProxyConfiguration matched:
- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)
CodecsAutoConfiguration matched:
- @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
CodecsAutoConfiguration.JacksonCodecConfiguration matched:
- @ConditionalOnClass found required class 'com.fasterxml.jackson.databind.ObjectMapper'; @ConditionalOnMissingClass did not find unwanted class (OnClassCondition)
Spring Boot提供的自动配置的配置类都在spring-boot-autoconfigure-xxx.jar
的META-INF/spring.factories
文件中配置,对应的配置Key是org.springframework.boot.autoconfigure.EnableAutoConfiguration
。如果需要实现自己的自动配置类,也需要在Classpath下的META-INF/spring.factories
文件中做相同的配置。
(注:本文是基于Spring Boot 2.0.3所写)
相关推荐
7.3.1 Spring Boot 提供的自动配置 182 7.3.2 接管Spring Boot 的Web 配置 185 7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190...
7.3.1 Spring Boot 提供的自动配置 182 7.3.2 接管Spring Boot 的Web 配置 185 7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190...
7.3.1 Spring Boot 提供的自动配置 182 7.3.2 接管Spring Boot 的Web 配置 185 7.3.3 注册Servlet、Filter、Listener 186 7.4 Tomcat 配置 187 7.4.1 配置Tomcat 187 7.4.2 代码配置Tomcat 188 7.4.3 替换Tomcat 190...
SpringBoot的自动配置原理 Spring Boot中的监视器是什么? Spring SpringMVC SpringBoot以及SpringCloud之间存在什么样的关系? SpringBoot中如何解决跨域问题 SpringBoot打成的jar和普通的jar有什么区别? ...
通过Spring Boot的自动配置和快速开发特性,系统能够快速搭建并投入使用,大大缩短了开发周期。同时,系统采用了模块化设计,各功能模块之间耦合度低,便于后期的维护和扩展。 除了基本的成绩管理功能外,该系统还...
技术包括:Spring Boot、Apache Shiro、MyBatis、MySQL、Thymeleaf、Bootstrap、Hplus 功能包括: 用户管理、部门管理、岗位管理、菜单管理、角色管理、字典管理、参数管理、通知公告、操作日志、登录日志、在线用户...
定义: starter是一种服务(或者叫插件)——使得...Spring Boot的启动类上有一个@SpringBootApplication注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,就是开启自动配置。 “); return stri
springBoo 核心原理、启动流程 Spring Boot项目构建过程 自动化配置Spring和第三方 库 提供生产就绪功能 极少的代码生成和XML配置 快速启动流程 echarts核心技术 : 大数据量渲染 ECharts解决方案——ZRender ...
OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目, mysql底层数据库,前端采用freemarker模板引擎,Bootstrap作为前端UI框架, 集成了jpa、mybatis等框架。作为初学springboot的同学是一个...
#### Snowy短视频 —— 基于 uni-app 与 Springboot 开发(前端部分) #### 项目UI框架为 ColorUI,另外感谢本项目使用到的搜索等插件的提供者~ ### 环境依赖 * uni-app 开发工具 HBuilderX; * 微信开发者工具...
NoSlowQ(no-slow-query)——一个能够轻松发现新增SQL语句,并能自动做分析和通知的系统,由 和 组成。 (系统开发的原因和灵感可以查看 ) 系统架构图如下: 整体效果 1、登录页面 技术栈 后端技术栈 1.SpringBoot 2...