狂神 SpringBoot 自动装配原理初探

news/2024/5/19 3:02:03 标签: spring, java, spring boot, annotations, 反射

原理初探

自动配置

pom.xml

pom.xml下有parent

image-20200910220111831

spring-boot-starter-parent下还有parent

image-20200910220329482

spring-boot-dependencies没有parent了,里面存放着各种东西的jar包

所以pom.xml中

  • spring-boot-dependencies :存放着核心依赖
  • 我们在写或者引入一些springBoot依赖的时候,不需要指定版本,就是因为有这些版本仓库

启动器

  • image-20200910223740449
  • 应该是没有显式
  • springboot会将所有的功能场景,都变成一个个启动器
  • 要使用什么功能只要找到对应的启动器就可以

主程序

java">@SpringBootApplication
public class DemoApplication {

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }

}

进入注解,里面两个核心注解

java">@SpringBootConfigurationspringboot的配置
    @Configurationspring配置类
    	@Component  :说明这也是一个spring的组件

@EnableAutoConfiguration  :  自动配置
    @AutoConfigurationPackage  :  自动配置包
    	@Import(AutoConfigurationPackages.Registrar.class)  : 导入选择器 包注册
    		AutoConfigurationPackages.Registrar
    			metadata  :元数据
    
    @Import(AutoConfigurationImportSelector.class)  :导入  自动配置导入选择器
    		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
			获取候选的配置

获取候选的配置

java">protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
         getBeanClassLoader());
    断言非空,“没有加载出META-INF下的spring.factories文件”
   	spring.factories是一个自动配置的核心文件
    
   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;
}

/**
	 * Return the class used by {@link SpringFactoriesLoader} to load configuration
	 * candidates.
	 * @return the factory class
	 */
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
    return EnableAutoConfiguration.class;
}
启动类下的所有资源被导入
@SpringBootApplication  : 标注这个类是一个springboot的应用:启动类下的所有资源被导入

断言非空,“没有加载出META-INF下的spring.factories文件”
spring.factories是一个自动配置的核心文件

image-20200910233408227

spring启动器,自动配置,META-INF目录下有个spring.factories核心文件

image-20200910233656503

所有的自动配置都在这了

image-20200910234618488探究如何加载

image-20200910234641303

java">Properties properties = PropertiesLoaderUtils.loadProperties(resource);
里面做的工作,将所有资源加载到配置类中

image-20200910234859230

FACTORIES_RESOURCE_LOCATION
工厂资源位置

image-20200910235030692

位置就是刚刚自动配置的位置

这么多自动配置不是全部都生效了的,是有部分没生效的,需要有相关的启动start才能生效

image-20200911002635572

没生效就会爆红

@ConditionalOnBean
这也是一个核心注解
会判断条件成立才会加载这个类

结论

springboot所有自动配置都是在启动的时候扫描并加载

所有的自动配置类都在spring-boot-autoconfigure-2.2.9.RELEASE.jar/META-INF/spring.factories

部分没生效,通过@ConditionalOnBean来判断条件是否满足,

只要导入对应的start,就有对应的启动器,自动装配才会生效,配置成功

  • springboot启动时,扫描spring.factories获取指定的值
  • 将自动配置的类导入容器,自动配置类生效,帮我们自动配置
  • 以前需要自动配置的东西,springboot帮忙完成
  • 整个javaEE,解决方案,自动配置的东西都在spring-boot-autoconfigure-2.2.9.RELEASE.jar包下
  • 把所有需要导入的组件,以类名的方式返回,这些组件将会被导入容器
  • 容器中名为xxxAutoConfiguration的文件,就是这些类给容器中导入了整个场景需要的所有组件
    • 里面一般有@Bean来进行自动配置
    • image-20200911003624650
    • image-20200911003842595
    • image-20200911003911665
  • 有了自动配置类,就免去了手动编写配置文件的工作

自动配置原理分析


http://www.niftyadmin.cn/n/1699127.html

相关文章

jquery在线引用

转载&#xff1a;http://www.cnblogs.com/lzx-1024/p/7716615.html jquery-3.1.1&#xff08;最新&#xff09;官网jquery压缩版引用地址:<script src"https://code.jquery.com/jquery-3.1.1.min.js"></script> jquery-3.0.0官网jquery压缩版引用地址:&l…

IBatis的分页研究

IBatis的分页研究 博客分类&#xff1a; Ibatis学习摘自&#xff1a; http://cpu.iteye.com/blog/311395 yangtingkun Oracle分页查询语句 ibaits.jar OracleDialect.java 在看JPetStore的代码时&#xff0c;发现它的分页处理主要是通过返回PaginatedList对象来完成的。如&am…

第一个SpringBoot程序 修改banner

第一个SpringBoot程序 两种创建方法 使用网站生成项目 https://start.spring.io/ maven、java版本、项目名称、导出jar、添加springWeb 这种方式一般不用&#xff0c;一般直接idea生成 IDEA创建 可能会遇到的问题 无效发行版本 项目结构设置 项目打开&#xff0c…

joomla+连接不上mysql_如何修复Joomla中的数据库连接错误

您的Joomla网站上有空白页面显示此消息吗&#xff1f;Error displaying the error page: Application Instantiation Error: Could not connect to MySQL.这意味着您的Joomla系统无法连接到您的数据库。由于您的网站数据存储在那里&#xff0c;因此修复连接以恢复网站非常重要。…

mysql revoke select from_Mysql grant to (revoke from)

本文实例&#xff0c;运行于 MySQL 5.0 及以上版本。MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant权限on数据库对象to用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。grantselectontestdb.*tocommon_user%grantinser…

在IIS建立的ftp,可以成功连接登录,但是不显示目录

IIS建立FTP站点很简单&#xff0c;不作说明 Windows的防火墙也开通了FTP端口&#xff08;默认21&#xff09;&#xff0c;Telnet也是通的&#xff0c;在本机可以打开&#xff0c;在局域网其它电脑或外网也可以连接&#xff0c;但就是不显示目录&#xff0c;如果用浏览器打开提示…

Shiro 简单项目记录、狂神Shiro、 Spring整合Shiro、认证、授权、Shiro-Thymeleaf整合,Shiro整合Mybatis

Shiro简单项目记录 Shiro简单项目下载 项目结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns"http://maven.apache.org/POM/4.0.0"xsi:schemaL…

SQL字符函数练习

SQL字符函数练习 --截取字符函数&#xff1a;substr(字符串&#xff0c;起始位置【&#xff0c;截取个数】) SELECT substr(abcdefg,3,2) FROM dual; --结果为cd SELECT substr(abcdefg,-3,2) FROM dual; --结果为df。起始位置可以是负数&#xff08;右数第N位&#xff09;-…