spring boot 核心_SpringBoot 核心技术 — 自动配置
SpringBoot 能实现快速开发和部署的需求,越来越流行。
- 约定优于配置
SpringBoot 重要概念之一 约定优配置。这是一种开发模式吧,按照行业的规则,规定,减少不必要的开发。
如:
驼峰规则。
maven src 目录放源文件,resources 放资源文件,test 放测试文件。
这就是种约定。 - 自动配置
自动配置是SpringBoot 的核心思想,也是实现 ‘开箱即用’ 的原理。
-加入依赖,按约定配置,即可以使用。
比如我们需要使用 Redis 我们只需要加入 Redis的依赖 和 按约定配置Redis地址,密码就可以使用。无需再配置一大堆东西。
这就是开箱即用和约定帮我们简化开发。 - 自动配置原理
使用SpringBoot 我们经常看到 xxx-starter ,无论是官方的还是第三方的 starter,这些 starter 就是实现 自动配置 的 ‘元凶’。
打开这些 starter 都会发现每个starter 的 META-INF 目录下都会有一个 spring.factories 文件。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
上面记录了 一个该 starter 的 ‘启动类’, SpringBoot 会扫描 ClassPath 下的 所有spring.factories 文件 并按照上面的‘启动类’ 去初始化我们的类。
这种思想类似 Java SPI 类似。
DruidDataSourceAutoConfigure 这个启动类就是去初始化我们数据源的启动类。
- 自动配置源码
完成自动装配主要靠 @EnableAutoConfiguration 完成;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({EnableAutoConfigurationImportSelector.class})
public
@interface
EnableAutoConfiguration
{
String ENABLED_OVERRIDE_PROPERTY =
"spring.boot.enableautoconfiguration";
Class<?>[] exclude()
default
{};
String[] excludeName()
default
{};
}
里面初始化了一个 EnableAutoConfigurationImportSelector.class ;
扫描 spring.factories 就是由这个类完成的。该类基础了
AutoConfigurationImportSelector.class
主要方法:
AutoConfigurationImportSelector:
protected
List<String> getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes)
{
List<String> configurations =
SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(),
this.getBeanClassLoader());
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
SpringFactoriesLoader: 扫描 Classpath下 spring.factories
public
static
List<String> loadFactoryNames(Class<?> factoryClass,
ClassLoader classLoader)
{
String factoryClassName = factoryClass.getName();
try
{
Enumeration<URL> urls = classLoader !=
null?classLoader.getResources("META-INF/spring.factories"):ClassLoader.getSystemResources("META-INF/spring.factories");
ArrayList result =
new
ArrayList();
while(urls.hasMoreElements())
{
URL url =
(URL)urls.nextElement();
Properties properties =
PropertiesLoaderUtils.loadProperties(new
UrlResource(url));
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
}
catch
(IOException var8)
{
throw
new
IllegalArgumentException("Unable to load ["
+ factoryClass.getName()
+
"] factories from location ["
+
"META-INF/spring.factories"
+
"]", var8);
}
}
- 自定义自己的 Starter
命名规范:
Spring 官方 Starter通常命名为spring-boot-starter-{name}如 spring-boot-starter-web, Spring官方建议非官方Starter命名应遵循 {name}-spring-boot-starter 的格式。
Starter一般有:
读取配置类
提供服务类
自动配置类
配置文件
读取配置类(MyProperties)用于读取 .properties 或者 .yml 约定的配置。
package com.linving.starter.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* Created by linli on 2018/1/20.
*/
@ConfigurationProperties("linving")
public
class
MyProperties
{
private
String name;
private
Integer age;
public
String getName()
{
return name;
}
public
void setName(String name)
{
this.name = name;
}
public
Integer getAge()
{
return age;
}
public
void setAge(Integer age)
{
this.age = age;
}
}
提供服务类(MyProvider) 对外提供服务的类。
package com.linving.starter.service;
/**
* Created by linli on 2018/1/20.
*/
public
class
MyProvider
{
private
String name;
private
Integer age;
public
MyProvider(String name,
Integer age)
{
this.name = name;
this.age = age;
}
public
String getName()
{
return name;
}
public
void setName(String name)
{
this.name = name;
}
public
Integer getAge()
{
return age;
}
public
void setAge(Integer age)
{
this.age = age;
}
}
自动配置类 (MyAutoConfigure),给Springboot 自动配置的初始类 ,这个是必须的。
/**
* Created by linli on 2018/1/20.
*/
@Configuration
@ConditionalOnClass(MyProvider.class)
@EnableConfigurationProperties(MyProperties.class)
@ConditionalOnProperty(prefix="linving",value="enabled",matchIfMissing=true)
public
class
MyAutoConfigure
{
@Autowired
MyProperties properties;
@Bean
MyProvider myProvider(){
return
new
MyProvider(properties.getName(),properties.getAge());
}
}
@ConditionalOnClass,当classpath下发现该类(MyProvider)的情况下进行自动配置。
@ConditionalOnMissingBean,当Spring Context中不存在该Bean时。
@ConditionalOnProperty(prefix=”linving”,value=”enabled”,matchIfMissing=true)
,当配置文件中linving.enabled=true时,才会自动配置,初始化我们的 MyProvider等。
等还有很多配置
https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-bean-conditionsns
配置文件(spring.factories);
上面说过这个的作用了。
#
Auto
Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.linving.starter.MyAutoConfigure
最后打包发布到 maven。
- 使用我们的 Starter
加入依赖(没有按规则命名):
<dependency>
<groupId>com.linving.starter</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在 application.properties 配置我们的约定
linving.name=dog
linving.age=26
这里我们就可以直接使用 我们的MyProvider了。SpringBoot 启动的时候已经帮我们自动装配了。
@RestController
public
class
HelloController
{
@Autowired
MyProvider provider;
@GetMapping("/hello")
public
String input(){
return provider.getName()+"";
}
}
这就是一个简单的 Starter,也是SpringBoot 的核心思想。
spring boot 核心_SpringBoot 核心技术 — 自动配置相关推荐
- Spring Boot核心原理-自动配置
作者简介:朱清,毕业于电子科技大学,现任职冰鉴科技高级研发经理,主导冰鉴风控系统架构设计和研发. 之前在公司内部推行spring boot时,有同事跟我提到过,感觉换到spring boot这个框架后 ...
- Spring Boot 面试杀手锏:自动配置原理
欢迎关注方志朋的博客,回复"666"获面试宝典 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如 ...
- Spring Boot是如何实现自动配置的?
原文:sylvanassun.github.io/2018/01/08/2018-01-08-spring_boot_auto_configure/ Spring Boot 是 Spring 旗下众多 ...
- springboot生成包含特定数字_面试必问 —— Spring Boot 是如何实现自动配置的?
什么是@Conditional? AutoConfigure源码分析 自动配置类中的条件注解 <Netty 实现原理与源码解析 -- 精品合集> <Spring 实现原理与源码解析 ...
- Spring Boot(03)——自动配置
Spring Boot 自动配置 Spring Boot的自动配置功能会根据Classpath中的Class为我们自动创建相应的bean.比如当classpath下存在MongoClient.clas ...
- spring boot 核心_Spring Boot 的 10 个核心模块
作者:Java技术栈 链接:https://www.jianshu.com/p/11c54edc2d11 学习 Spring Boot 必须得了解它的核心模块,和 Spring 框架一样,Spring ...
- java spring boot缓存_Springboot对缓存的支持
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 缓存是依赖于org.springframework.cache.Cache和 org.springframework.cache.CacheManager ...
- Spring Boot核心配置
转载自 Spring Boot核心配置 启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleContr ...
- Spring Boot核心(基本配置)
上一篇Spring Boot我们简单讲了如何快速创建一个SpringBoot项目.大家都知道SpringBoot非常强大,可以轻松与各种工具集成,但是我们知其然,也必须知其所以然.今天开始就和大家一起 ...
最新文章
- 2021春季学期-创新设计与实践-Lesson1
- mysql数据库容量查询
- sql,两个表关联,根据B表更新A表
- Ubuntu 9.04下安装source navigator---linux下看代码工具
- Android之PhotoView使用(原创)
- 使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在
- ELK学习总结(3-2)elk的过滤查询
- Java的四种包访问权限
- python内置数据结构_Python内置数据结构(一)
- ubuntu16.04环境下使用ros运行ORB-SLAM3
- 吴恩达机器学习入门(配合吴恩达机器学习视频篇)
- docker核心视频教程
- ERStudio 安装
- php追加append,PHP ArrayObject append()用法及代码示例
- php正则表达式表情,php正则表达式储存展示表情字符的方法
- matlab 怀特图,怀特异方差检验方法在matlab中的实现,以及广义最.....
- SECS半导体设备通讯-3 SECS-II通信标准
- 给宝宝起名,您重视了吗?
- 服务器Linux系统安全升级
- 使用代码实现网站文章发布后自动提交到百度的方法