登录/注册
唐某
11055
占位
7
占位
31
浏览量
占位
粉丝
占位
关注
8张图带你彻底把springboot自动配置原理搞明白
唐某
2020-10-16 11:53:08 2020-10-16
467
1

  前言

  随着互联网越来越流行,springboot已经成为我们无论是工作,还是面试当中,不得不掌握的技术。说起springboot笔者认为最重要的功能非自动配置莫属了,为什么这么说?如果参与过以前spring复杂项目的朋友肯定,有过这样的经历,每次需要一个新功能,比如事务、AOP等,需要大量的配置,需要导出找jar包,时不时会出现jar兼容性问题,可以说苦不堪言。

  springboot的出现得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集成),这是基于Spring 4.x以上的版本提供的按条件配置Bean的能力。有了springboot的自动配置的功能,我们可以快速的开始一个项目。

  一 什么是自动配置

  不知道朋友们在工作当中有没有这样的经历:

  1.1 引入redisTemplate

  只要我们在pom.xml文件中引入spring-boot-starter-data-redis-xxx.jar包,然后只要在配置文件中配置redis连接,如:

  spring.redis.database = 0spring.redis.timeout = 10000spring.redis.host = 10.72.16.9spring.redis.port = 6379spring.redis.pattern = 1

  就可以在service方法中直接注入StringRedisTemplate对象的实例,可以直接使用了。朋友们有没有想过这是为什么?

  @Autowiredprivate StringRedisTemplate stringRedisTemplate; 1.2 引入transactionTemplate

  在项目中只要引入spring-boot-starter-xxx.jar,事务就自动生效了,并且可以直接在service方法中直接注入TransactionTemplate,用它开发编程式事务代码。是不是很神奇?这又是为什么?

  1.3 使用@ConfigurationProperties

  使用@ConfigurationProperties可以把指定路径下的属性,直接注入到实体对象中,看看下面这个例子:

  @Data@Component@ConfigurationProperties("jump.threadpool")public class ThreadPoolProperties { private int corePoolSize; private int maxPoolSize; private int keepAliveSeconds; private int queueCapacity;}

  只要application.properties这样配置,就可以自动注入到上面的实体中

  jump.threadpool.corePoolSize=8jump.threadpool.maxPoolSize=16jump.threadpool.keepAliveSeconds=10jump.threadpool.queueCapacity=100

  没错,这三个例子都是springboot自动配置在起作用,我们分为两种情况:bean的自动配置 和 属性的自动配置。

  二 工作原理
2.1 bean的自动配置

  Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。

  我们先看看@SpringBootApplication注解

  

  它上面定义了另外一个注解:@EnableAutoConfiguration

  

  该注解的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包下面key是EnableAutoConfiguration全名的,所有自动配置类。

  我们看看springboot的spring-boot-autoconfigure-xxx.jar

  

  该jar包里面就有META-INF/spring.factories文件。

  

暂无评论