SpringBoot注解自动扫描-底层实现
分析上文Spring Boot快速入门
@SpringBootApplication
public class HelloWorldApplication {
public static void main(String[] args) {
//Spring应用启动起来
SpringApplication.run(HelloWorldApplication.class,args);
}
}
@SpringBootConfiguration:Spring Boot的配置类,我们点击进去查看
我们看到28行的注解
@EnableAutoConfiguration:开启自动配置的功能
以前我们使用三大框架时,很多东西需要自己在xml中配置,但现在Spring Boot帮我们自动配置-》就是该注解实现的
我们ctrl+右键点击该注解查看

@Import({AutoConfigurationImportSelector.class})
@Import:Spring的底层注解,向容器中导入一个组件
@AutoConfigurationPackage:添加该注解的类所在的package 作为 自动配置package 进行管理
点击@AutoConfigurationPackage注解进去查看源码

点击21行的Registrar.class

在该处打上断点,在debug模式下进行源码追踪
选中(String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0])-》右键-》Evaluate expression-》Evaluate
我们发现将@SpringBootApplication标注的类的所在包及其下面所有的子包的所有组件扫描到了Spring容器中,所以我们必须将Controller、service、dao等放到主配置类所在包的子包中
@Import({AutoConfigurationImportSelector.class})
AutoConfigurationImportSelector.:导入哪些组件的选择器,将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
断点追踪


有了上面的自动配置类,我们就不需要再手动编写;那么自动配置类是从哪里扫描到这些自动配置类呢

SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader())
我们点击loadFactoryNames查看进一步查看源码实现方式

springboot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就开始生效,帮我们进行配置工作
打开我们导入的包


查看web自动配置类点击查看源码


我们能够看到我们在SpringMVC中配置的很多功能,比如视图解析器(如上图所示)
J2EE的整体解决方案和自动配置都在spring-boot-autoconfigure-2.3.6.RELEASE.jar中
(比如我们熟悉的aop:事务,cache:缓存,dao:持久层 等等

这就是约定大于配置
SpringBoot注解自动扫描-底层实现的更多相关文章
- springboot注解大全
springboot注解:@Service: 注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据 ...
- 【转载】springboot注解
https://blog.csdn.net/yitian_66/article/details/80866571 springboot注解:@Service: 注解在类上,表示这是一个业务层bean@ ...
- springboot注解使用说明
springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...
- Spring-扫描注解原理,注解自动扫描原理分析
注解自动扫描原理分析 在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢? <context:component-scan base-packa ...
- SpringBoot注解把配置文件自动映射到属性和实体类实战
SpringBoot注解把配置文件自动映射到属性和实体类实战 简介:讲解使用@value注解配置文件自动映射到属性和实体类 1.配置文件加载 方式一 1.Controller上面配置 @Propert ...
- SpringBoot集成MyBatis底层原理及简易实现
MyBatis是可以说是目前最主流的Spring持久层框架了,本文主要探讨SpringBoot集成MyBatis的底层原理.完整代码可移步Github. 如何使用MyBatis 一般情况下,我们在Sp ...
- SpringBoot注解综合
SpringBoot注解综合 @Bean 注解通常会应用在一些配置类(由@Configuration注解描述)中,用于描述具备返回值的方法,然后系统底层会通过反射调用其方法,获取对象基于作用域将对象进 ...
- springBoot系列-->springBoot注解大全
一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...
- SpringBoot注解大全(转)
原文链接:[springBoot系列]--springBoot注解大全 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Co ...
随机推荐
- 如何实现ARC中weak功能?
原文链接 我们都知道ARC中weak与assign或者说unsafe_unretained最大的不同就是设置weak属性后,系统会在对象被释放后自动将指向对象的指针置为nil,而assign则会产生一 ...
- vue项目部署到阿里云服务器(windows),Nginx代理!
项目构成: 前端:vue+vant-ui, 数据库:mysql, 后端:node.js 部署方式:nginx代理: 一,首先要拥有自己的服务器,阿里,腾讯都可以,我用的是阿里的: 如果只是做个人项目的 ...
- JavaWeb 10_Filter过滤器
一.什么是Filter? 1.Filter 过滤器它是JavaWeb的三大组件之一-.三大组件分别是: Servlet 程序.Listener 监听器.Filter 过滤器2.Filter 过滤器它是 ...
- 内置方法 __new__ __del__
1.__new__ 构造方法 实例化对象是先执行__new__方法,但是类中没有__new__方法,所以先到父类object类中的new方法,开辟一个属于对象的空间,然后再执行init方法 设计模式: ...
- Linux 安装mysql 看这一篇就够了
mysql 安装教程 下载地址:https://downloads.mysql.com 查看系统中默认的mysql 依赖 rpm -qa | grep mysql rpm -qa | grep mar ...
- Hadoop-全分布式配置
目录 一.配置基础环境 1.配置网络信息 2.配置主机名 3.主机名与IP的映射关系 4.测试互通性 二.关闭防火墙和SELinux 1.关闭防火墙 2.关闭SELinux 三.安装 Hadoop 1 ...
- 22.1.23Manacher算法、双端队列、单调栈
22.1.23Manacher算法.双端队列.单调栈 1.Manacher算法 1)用途: Manacher算法用于解决类似求某个字符串中最长的回文子串.(回文就是正着读和倒着读一样的结构). 2)算 ...
- BFC优化?
块格式化上下文, 特性: 使 BFC 内部浮动元素不会到处乱跑: 和浮动元素产生边界.
- XML文档约束有哪几种?有什么区别?
XML DTD(功能有限) XML Schema (功能强大) Schema本身是XML的,可以被XML解析器解析(这也是从DTD上发展schema的根本目的),Schema支持命名空间,Schema ...
- Dubbo 使用过程中都遇到了些什么问题?
在注册中心找不到对应的服务,检查 service 实现类是否添加了@service 注解 无法连接到注册中心,检查配置文件中的对应的测试 ip 是否正确