springboot autoconfig
springboot自动配置的核心思想是:springboot通过spring.factories能把main方法所在类路径以外的bean自动加载
springboot starter验证
我在springboot启动方法所辖的包外添加三个类:
@Configuration//开启配置
@EnableConfigurationProperties(HelloProperties.class)//开启使用映射实体对象
@ConditionalOnClass(TestHello.class)//存在HelloService时初始化该配置类
@ConditionalOnProperty//存在对应配置信息时初始化该配置类
(
prefix = "zxp.hello",//存在配置前缀hello
value = "flag"//开启
)
public class HelloAutoConfiguration {
@Autowired
private HelloProperties helloProperties; @Bean//创建HelloService实体bean
@ConditionalOnMissingBean(TestHello.class)//缺失HelloService实体bean时,初始化HelloService并添加到SpringIoc
public TestHello helloService()
{
System.out.println(">>>The TestHello Not Found,Execute Create New Bean.");
TestHello testHello = new TestHello(helloProperties.getName(),helloProperties.getFlag());
return testHello;
}
}
@ConfigurationProperties(prefix = "zxp.hello")
@Data
public class HelloProperties {
private String name;
private String flag;
}
public class TestHello {
String name;
String flag;
public TestHello(String name, String flag) {
this.name = name;
this.flag = flag;
}
public String print(){
String msg = "name is "+name + " " + "flag is "+flag;
System.out.println(msg);
return msg;
}
}
在main方法所在包范围内新建Controller
@RestController
public class TempController {
@Autowired
TestHello testHello;//无法注入,报错!!!! @RequestMapping("/test/boot")
public String boot(){
return testHello.print();
}
}
会在上面代码标注位置报错。因为 TestHello并没有托管给spring管理。
在resources下创建META-INF路径,并创建spring.factories文件
#配置自定义Starter的自动化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=springbootautoconfig.test.config.HelloAutoConfiguration
再试启动又报错了
- Bean method 'helloService' not loaded because @ConditionalOnProperty (zxp.hello) did not find property 'flag'
原因是如果没有配置zxp.hello.flag会报错
@ConditionalOnProperty//存在对应配置信息时初始化该配置类
(
prefix = "zxp.hello",//存在配置前缀hello
value = "flag"//开启
)
这里如果不想报错,需要加入 matchIfMissing = false
在application.properties中添加
zxp.hello.flag=2
成功了,访问controller,返回“name is null flag is 1”
SpringBoot starter部分注解说明
@ConditionalOnXxx 可以根据条件来决定是否执行自动配置
@ConditionalOnBean:当SpringIoc容器内存在指定Bean的条件
@ConditionalOnClass:当SpringIoc容器内存在指定Class的条件
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在时查找指定的位置
@ConditionalOnMissingBean:当SpringIoc容器内不存在指定Bean的条件
@ConditionalOnMissingClass:当SpringIoc容器内不存在指定Class的条件
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnSingleCandidate:当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication:当前项目是Web项目的条件
SpringBoot starter原理
@SpringBootApplication -》 @EnableAutoConfiguration -》@Import(AutoConfigurationImportSelector.class)
SpringFactoriesLoader.loadFactoryNames方法扫描了所有JAR包的META-INF/spring.factories
spring-boot-autoconfigure包内的spring.factories文件内容
work.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
……非常多,包含了JPA的,包含了spring官方推荐starter的aotuconfig
springboot autoconfig的更多相关文章
- alibaba druid 在springboot start autoconfig 下的bug
alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...
- SpringBoot是如何启动的?
本文是通过查看SpringBoot源码整理出来的SpringBoot大致启动流程,整体大方向是以简单为出发点,不说太多复杂的东西,内部实现细节本文不深扣因为每个人的思路.理解都不一样,我个人看的理解跟 ...
- SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移?
Liquibase是一个用于用于跟踪.管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(ro ...
- SpringBoot数据库管理 - 用flyway对数据库管理和迁移
上文介绍了Liquibase,以及和SpringBoot的集成.除了Liquibase之外,还有一个组件Flyway也是经常被使用到的类似的数据库版本管理中间件.本文主要介绍Flyway, 以及Spr ...
- Spring Boot 揭秘与实战 自己实现一个简单的自动配置模块
文章目录 1. 实战的开端 – Maven搭建 2. 参数的配置 - 属性参数类 3. 真的很简单 - 简单的服务类 4. 自动配置的核心 - 自动配置类 5. spring.factories 不要 ...
- Spring Boot从入门到实战:整合Web项目常用功能
在Web应用开发过程中,一般都涵盖一些常用功能的实现,如数据库访问.异常处理.消息队列.缓存服务.OSS服务,以及接口日志配置,接口文档生成等.如果每个项目都来一套,则既费力又难以维护.可以通过Spr ...
- Spring Boot2从入门到实战:统一异常处理
都说管理的精髓就是“制度管人,流程管事”.而所谓流程,就是对一些日常工作环节.方式方法.次序等进行标准化.规范化.且不论精不精髓,在技术团队中,对一些通用场景,统一规范是必要的,只有步调一致,才能高效 ...
- 一个轻量级的基于RateLimiter的分布式限流实现
上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只 ...
- 深入SpringBoot:自定义Endpoint
前言 上一篇文章介绍了SpringBoot的PropertySourceLoader,自定义了Json格式的配置文件加载.这里再介绍下EndPoint,并通过自定EndPoint来介绍实现原理. En ...
随机推荐
- JS实现页面刷新方法
下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.loc ...
- 漫画:深入浅出 ES 模块
本文来自网易云社区. 本文翻译自:ES modules: A cartoon deep-dive ES 模块为 JavaScript 提供了官方标准化的模块系统.然而,这中间经历了一些时间 —— 近 ...
- linux命令之ll按时间和大小排序显示
ll不是命令,是ls -l的别名 按大小排序 [root@localhost ~]# ll -Sh 按时间排序 [root@localhost ~]# ll -rt ll -t 是降序, ll -t ...
- base64编码后的pdf文件前端页面展示--pdf.js的应用
最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...
- Linux下从零开始学习Python之环境搭建
我本人用的是Centos7.4版本,下载地址 archive.kernel.org/centos-vault/7.4.1708/isos/x86_64/CentOS-7-x86_64-DVD-1708 ...
- python进程之理论
********进程理论知识******** ****操作系统背景知识**** 顾名思义,进程及正在执行的一个过程,进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念, ...
- 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)
关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...
- 2019-CCPC广东省赛总结
2018年11月第一次参加ICPC区域赛青岛赛区,打铁了! 2019年5月第一次参加CCPC广东省赛,4题滚粗,C题莫队TLE13发,只拿了个铜牌! 教训总结: 比赛时千万不能犹豫,不能犹豫,不能犹豫 ...
- jQuery banner切换插件
今天学写了一个基于jQuery焦点图切换插件,有不对的地方还请多多指教,不多说下面是代码: 1.引jQuery库 <script src="http://code.jquery.com ...
- D. Restructuring Company 并查集 + 维护一个区间技巧
http://codeforces.com/contest/566/problem/D D. Restructuring Company time limit per test 2 seconds m ...