Spring Boot(03)——自动配置
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所写)

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
C++雾中风景番外篇2:Gtest 与 Gmock,聊聊C++的单元测试
正式工作之后,公司对于单元测试要求比较严格。(笔者之前比较懒,一般很少写完整的单测~~)。作为一个合格的开发工程师,需要为所编写代码编写适量的单元测试是十分必要的,在实际进行的开发工作之中,TDD(Test drivern development) 是一种经过实践可行的开发方式。编写单元测试可以帮助我们在开发阶段就发现错误,并且保证新的修改没有破坏已有的程序逻辑。 在 C++之中,常用的测试框架有 Gtest,Boost test,CPPUint 等。正是由于 Gmock 的加持,让 Gtest 在多种测试框架之中脱颖而出。今天笔者在这里要和大家聊聊的就是目前我司主力在使用的Gtest,以及配套的 Gmock,通过两者的配合使用,相信能够搞定绝大多数的测试场景了。 1.Gtest 的安装 笔者目前使用的系统是Deepin 15.6,是基于 Debian jessie的一款国内发行版。安装 Gtest 和 GMock 十分简单: sudo apt-get install libgtest-dev libgmock-dev 其他发行版如:Ubuntu,Centos 应该也可以通过自带的包管...
- 下一篇
Spring Boot(04)——创建自己的自动配置
创建自己的自动配置 当你的应用需要以jar包的形式提供给其它应用使用时,可以考虑把它们封装为一个Spring Boot Starter。即该jar包是可以自动添加需要引用的依赖项,也能够对核心功能进行自动配置。自动配置的核心类是一个标注了@Configuration的类,然后在自动配置类中可以定义相应的bean。比如下面的配置类中定义了一个HelloBean类型的bean。 @Configuration public class HelloAutoConfiguration { @Bean public HelloBean helloBean() { return new HelloBean(); } } 然后需要在Classpath下的META-INF/spring.factories中以org.springframework.boot.autoconfigure.EnableAutoConfiguration为Key,以对应的自动配置类为Value进行配置,如果有多个自动配置类,多个自动配置类之间可以以英文逗号分隔。 org.springframework.boot.autocon...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS6,CentOS7官方镜像安装Oracle11G
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7设置SWAP分区,小内存服务器的救世主