概述
上面博文(简介与快速搭建)我们简单地介绍了什么是,以及如何使用,但是我们对于的基本原理并没有介绍,这篇博文我们重点介绍是如何实现的自动配置。
依赖管理
在我们的pom文件中最核心的依赖就一个:
org.springframework.boot spring-boot-starter-parent 2.4.4
它的父项目依赖,规定所有依赖的版本信息:
org.springframework.boot spring-boot-dependencies 2.4.4
由此,我们发现框架几乎声明了所有开发中常用的依赖的版本号,无需关注版本号,而且实现了自动版本仲裁机制,当然了我们也可以根据我们的需要,替换掉默认的依赖版本。
核心注解@n
@SpringBootApplication
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}
在上面的启动类中我们发现了一个陌生的注解@n,这个注解的是什么含义呢?我们点进去看一下。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
其实@n是上面三个注解的组合体,我们对这三个注解理解清楚就可以了,下面逐个进行解释:
@ion
@Configuration
public @interface SpringBootConfiguration {
@我们并不陌生,它允许在上下文中注册额外的bean或导入其他配置类,@ion其实代表当前类是一个配置类。
@ion
ion的目的是启动的自动配置机制。
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
1、kage指定默认的包规则
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
kage注解的作用是将 添加该注解的类所在的 作为 自动配置 进行管理。也就是说当应用启动时默认会将启动类所在的作为自动配置的。然后使用@注解将其注入到ioc容器中。这样,可以在容器中拿到该路径。
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
重点看下ons方法。
方法的第二个参数通过new ().()方法设置。
接着看下的构造器方法。
PackageImports(AnnotationMetadata metadata) {
AnnotationAttributes attributes = AnnotationAttributes
.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));
List packageNames = new ArrayList(Arrays.asList(attributes.getStringArray("basePackages")));
for (Class basePackageClass : attributes.getClassArray("basePackageClasses")) {
packageNames.add(basePackageClass.getPackage().getName());
}
if (packageNames.isEmpty()) {
packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));
}
this.packageNames = Collections.unmodifiableList(packageNames);
}
.(.())获取标注@kage注解的类的全限定名。
最后,利用给容器中导入一系列组件,将指定的包下的所有组件导入进来。
2、@(.class)
使用自动导入所有符合自动配置条件的Bean定义并加载到IOC容器
@Override
public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
Assert.state(deferredImportSelector instanceof AutoConfigurationImportSelector,
() -> String.format("Only %s implementations are supported, got %s",
AutoConfigurationImportSelector.class.getSimpleName(),
deferredImportSelector.getClass().getName()));
AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
.getAutoConfigurationEntry(annotationMetadata);
this.autoConfigurationEntries.add(autoConfigurationEntry);
for (String importClassName : autoConfigurationEntry.getConfigurations()) {
this.entries.putIfAbsent(importClassName, annotationMetadata);
}
}
1、利用Entry();给容器中批量导入一些组件 2、调用List = (, )获取到所有需要导入到容器中的配置类 3、利用工厂加载 Map> (@ );得到所有的组件 4、从META-INF/.位置来加载一个文件。 默认扫描我们当前系统里面所有META-INF/.位置的文件 -boot–2.4.4..jar包里面也有META-INF/.
文件里面写死了-boot一启动就要给容器中加载的所有配置类-boot–2.4.4..jar/META-INF/.,一共130个自动配置类。
130个场景的所有自动配置,会在启动的时候默认全部加载。n会按照条件装配规则(@),最终会按需配置。
小结:
为我们的应用程序启用了三个功能:自动配置,组件扫描,以及能够在”应用类”上定义额外的配置。
@
@在应用程序所在的软件包上启用扫描,指定扫描哪些注解。
为例
在130个场景有我们比较熟悉两个组件,和ion,我们以为例,看一下是如何自动装配的。
在注解中我们看到了大量以@开头的注解,即条件装配,满足指定的条件,则进行组件注入。@(.class)+@ies( = “”, = true),读取我们在配置文件编写的属性,并把它封装到中,以供随时使用。
此时我们的容器已经以Bean的形式被注入到了IOC容器中。
如何禁用特定的自动配置类
如果发现应用中不需要特定自动配置类,则可以使用属性@n来禁用它们,如以下示例所示:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
//@SpringBootApplication(excludeName = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"})
public class MyApplication {
}
如果该类不在类路径中,则可以使用注释的属性,并指定完全限定的名称(全类名字符串)。定义排除项,即可以使用哪个注释级别也可以使用属性来定义。
总结
ion —> 扫描on —> 根据条件@装配组件 —>根据加载属性值 —-> .
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,永久会员只需109元,全站资源免费下载 点击查看详情
站 长 微 信: nanadh666
声明:1、本内容转载于网络,版权归原作者所有!2、本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。3、本内容若侵犯到你的版权利益,请联系我们,会尽快给予删除处理!
AutoConfigurationImportSelector
Spring Boot
依赖管理
注解
娜娜
分享
收藏
点赞(0)
免费下载或者VIP会员资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
提示下载完但解压或打开不了?
最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。 若排除这种情况,可在对应资源底部留言,或联络我们。
找不到素材资源介绍文章里的示例图片?
对于会员专享、整站源码、程序插件、网站模板、网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
付款后无法显示下载地址或者无法查看内容?
如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理
购买该资源后,可以退款吗?
源码素材属于虚拟商品,具有可复制性,可传播性,一旦授予,不接受任何形式的退款、换货要求。请您在购买获取之前确认好 是您所需要的资源
上一篇
转发到头条
下一篇
知言合一教育分享|教你如何制作vlog(一)
相关文章
生活百科
中国小学500强,黄浦有4所!
在上海,什么最牛?不是你家拆迁分了8套房,也不是你广场舞斗赢了大妈,而是你能不费...
7 月前
0
0
1.9K
生活百科
海南医学院2023年普通高等教育招生章程
——海南医学院 ——2023年普通高等教育招生章程第一章 总则根据《中华人民共和...
10 月前
0
0
2.5K
生活百科
收藏!最新广东高校志愿填报指南
深圳新闻网是立足深圳、辐射全国的综合性区域门户网站,为用户提供新闻、视频、博客、...
6 月前
0
0
1.8K
生活百科
大衣哥前儿媳陈亚男近况曝光,摆脱往日稚嫩,多了几分成熟韵味
农民歌手大衣哥一家的生活日常,一直是网友们热衷关注的话题。 作为一个老百姓耳熟能...
8 月前
0
0
1.8K
站长简介 微信:nanadh666
公众号:娜娜创业日记
QQ群:278210989
本人创业10年,多家网站VIP付费会员,本站分享创业项目、创业教程、主题源码、电商教程、工具软件等也不断的从淘宝购买很多教程和模板。 做了这个网站用来分享这些精品付款资源。
最新实战项目
微头条变现写作课程,掌握流量变现技巧,提升微头条质量,实现收益增长
AI+自媒体运营变现课,掌握AI写作与RPA技术,轻松实现自媒体变现
微信朋友圈 广告投放全攻略:ADQ平台介绍、推广层级、商品库与营销目标
人工智能AI时代,饭碗频遭抢夺,普通人咋办?躺赢之道在何方?
图书博主养成记:4类带货方式,视频直播课助力,快速入局图文赛道
YouTube视频营销入门:账号注册指南,平台介绍与外贸推广
小红书飞书 模板实战变现:小红书快速起号,搭建一个赚钱的飞书模板
联盟营销实战指南,详解联盟模式、平台规则及联盟客运作,实现流量变现
同步各大论坛VIP资源,创业教程、自媒体、抖音快手短视频等视频教程以及营销软件、源码、淘宝虚拟资源等,长期更新各大付费创业项目
快速导航
实战项目免费项目自动项目网站源码
关于本站
VIP介绍合伙人介绍客服咨询推广计划
联系我们
微信客服
扫码加我微信
微信公众号
关注公众号
网站地图 Copyright © 2023 本站为非盈利性赞助网站,本站所有软件来自互联网,版权属原著所有,如有侵权,敬请来信联系我们,我们立即删除。 - All rights reserved
闽ICP备2023013435号
/*@media (min-width: 768px){*/
/*.py-md-4 {*/
/* padding-top: 1.5rem!important;*/
/* padding-bottom: 0rem!important;*/
/*}}*/
首页会员介绍用户中心
首页实战项目开通VIP我的加盟合伙人
首页
实战项目
免费项目
自动项目
开通会员限时5折
加盟合伙人
APP下载
生活百科
var zb = {"home_url":"https:\/\/www.taonana.cn","ajax_url":"https:\/\/www.taonana.cn\/wp-admin\/admin-ajax.php","theme_url":"https:\/\/www.taonana.cn\/wp-content\/themes\/ripro-v5","singular_id":"43395","post_content_nav":"0","site_popup_login":"1","site_notify_auto":"0","current_user_id":"0","ajax_nonce":"c4099f77a7","gettext":{"__copypwd":"\u5bc6\u7801\u5df2\u590d\u5236\u526a\u8d34\u677f","__copybtn":"\u590d\u5236","__copy_succes":"\u590d\u5236\u6210\u529f","__comment_be":"\u63d0\u4ea4\u4e2d...","__comment_succes":"\u8bc4\u8bba\u6210\u529f","__comment_succes_n":"\u8bc4\u8bba\u6210\u529f\uff0c\u5373\u5c06\u5237\u65b0\u9875\u9762","__buy_be_n":"\u8bf7\u6c42\u652f\u4ed8\u4e2d\u00b7\u00b7\u00b7","__buy_no_n":"\u652f\u4ed8\u5df2\u53d6\u6d88","__is_delete_n":"\u786e\u5b9a\u5220\u9664\u6b64\u8bb0\u5f55\uff1f"}};
(function(){
var el = document.createElement("script");
el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?b38fc1b4a0668a7c2cb975bbb26fef3329ce400567c1e04f47289e3a62667c923d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a";
el.id = "ttzz";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(el, s);
})(window)
(function(){
var el = document.createElement("script");
el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?ebded415054d3b078cff74cc51db0700195bafea6b214600891dbd43de6b68ccfd9a9dcb5ced4d7780eb6f3bbd089073c2a6d54440560d63862bbf4ec01bba3a";
el.id = "ttzz";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(el, s);
})(window)
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?c8bfa035760d88c8c595bdba887f3e8a";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
var ndt = $("#help dt");
var ndd = $("#help dd");
ndd.eq(0).show();
ndt.click(function () {
ndd.hide();
$(this).next().show();
});