首页 > 其他分享 >架构师养成记-springboot自动装配

架构师养成记-springboot自动装配

时间:2023-10-09 13:33:24浏览次数:45  
标签:装配 return springboot 配置 AutoConfigurationEntry annotationMetadata 架构师 exclusions

@SpringBootApplication

 

这其中有两个比较容易引起我们注意的地方,一个是 @springBoot(onfiguration 注解,另一个是 @nableAutoConfigurati
on 注解;

 进入了AutoConfigurationImportselector,class 类,因为谷歌翻译告诉我们,这个是自动配置导入选择器.

public class AutoConfigurationImportSelector
		implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
		BeanFactoryAware, EnvironmentAware, Ordered {


    @Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		// 获取自动配置的实体
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
				autoConfigurationMetadata, annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

    // 具体用来加载自动配置类的方法
	protected AutoConfigurationEntry getAutoConfigurationEntry(
			AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		// 获取候选的配置类,即使后宫佳丽三千,也是要筛选的
		List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);
		// 根据情况,自动配置需要的配置类和不需要的配置了
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		// 返回最终需要的配置
		return new AutoConfigurationEntry(configurations, exclusions);
	}
}

而这个自动配置的实体 AutoConfigurationEntry
里面有两个属性,configurations 和 exclusions 。

在后面可以看到 getAutoConfigurationEntry() 方法返回了一个对象 return new AutoConfigurationEntry(configuration
s,exclusions) 这里也就是把我们需要的配置都拿到了。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
			AnnotationAttributes attributes) {
		List<String> configurations=SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), 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;
	}

 实际上SpringBoot的自动装配原理,其实就是在项目启动的时候去加载META-INF下的 spring,factories 文件,好像也没有那么高大上。当然在启动的过程中还会有其他的配置项的加载,这里咱么直说了自动装配的加载过程。希望对大家可以有所启发。

标签:装配,return,springboot,配置,AutoConfigurationEntry,annotationMetadata,架构师,exclusions
From: https://www.cnblogs.com/dongxuanyang/p/17751503.html

相关文章

  • 4,rndc安装配置
    rndc远程管理DNS生成rndc-key#rndc-confgen-r/dev/urandom#Startofrndc.confkey"rndc-key"{algorithmhmac-md5;secret"MFM4AocpN0lcoL4fN2lA6Q==";};options{default-key"rndc-key";default-server127.0.0.1......
  • 实现starter组件自动装配以及可配置
    实现starter组件自动装配以及可配置自动装配的包,导入就可以进行自动装配了<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.1.4.RELEASE</version></dependency>......
  • SpringBootWeb案例-1上
    SpringBootWeb案例前面我们已经讲解了Web前端开发的基础知识,也讲解了Web后端开发的基础(HTTP协议、请求响应),并且也讲解了数据库MySQL,以及通过Mybatis框架如何来完成数据库的基本操作。那接下来,我们就通过一个案例,来将前端开发、后端开发、数据库整合起来。而这个案例呢,就是我们......
  • SpringBootWeb案例-1 -下
    3.员工管理完成了部门管理的功能开发之后,我们进入到下一环节员工管理功能的开发。基于以上原型,我们可以把员工管理功能分为:分页查询(今天完成)带条件的分页查询(今天完成)删除员工(今天完成)新增员工(后续完成)修改员工(后续完成)那下面我们就先从分页查询功能开始学习。3.1分页查询3.1.1......
  • SpringBoot+RabbitMQ+Redis 开发一个秒杀系统,细节打满(附源码)
    一、简易版秒杀SeckillProject系统简介开发技术二、实现细节记录1、用户密码两次MD5加密2、分布式session维持会话3、异常统一处理4、页面缓存+对象缓存5、页面静态化6、内存标记+Redis预减库存+RabbitMQ异步处理7、解决超卖8、接口限流三、效果展......
  • 架构师养成记-springboot
    1.什么是springboot? (1)是一款全新的框架,目的是为简化spring应用的初始搭建和开发过程,使用特定的方式来进行配置,从而使开发人员不需要定义样板化配置,达到"开箱即用"。 (2)核心思想是:约定大于配置。 springboot所有开发细节都是根据此思想进行实现的。2.什么是约定大于配置? ......
  • 架构师养成记-整合hikariCP
    1:pom文件中引入数据源驱动和mybatis依赖<!--mysql驱动--><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.41</version></dependency><!--mybatis--><depe......
  • 2.SpringBoot——常用注解
    Controller层//设置当前控制器类为RESTful风格,等同于@Controller与@ResponseBody两个注解的组合功能@RestController//设置当前控制器方法(模块)的请求访问路径@RequestMapping("/web/role")//依赖注入/自动装配,获取Bean@Resource@AutowiredAutowired和Resource的区别两者......
  • 1.SpringBoot——概述
    SpringBoot和SSM开发中有什么区别SpringBoot没有颠覆JavaEE开发,还是要学Spring,它是诸葛亮,提供多种用兵打仗的方案。SSM限定死了只能使用SSM开发JavaWeb应用。而SpringBoot没有与任何MVC框架绑定。一个很恰当的比喻是,SpringMVC、Websocket、Redis、MongoDB、kafka这些对应电......
  • SpringBoot简易任务栏示例
    一、概述现有这样一个需求:前端要求实现类似任务栏的东西(windows电脑的任务栏)。要求:可以向任务栏增加图标、删除图标、给任务栏中的图标排序以及加载任务栏图标列表参考样例图:规律图: 思路:(这里假设任务栏图标列表本身就是一个有序的集合,排序规则按照sort正向排序)......