springboot自动装配

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: springboot自动装配

一、概述

Springboot的自动配置是指在当前类目录下添加的jar包,能够自动根据Java配置、配置文件以及容器的环境变量等自动加载配置类。官方指定的自动配置类都是通过spring-boot-autoconfiguration来实现的,对于外部jar包,会定义META-INF/spring.factories配置文件,springboot的自动装配功能会从这个配置文件中找到配置类,将其org.springframework.boot.autoconfigure.EnableutoConfiguration 中的配置项通过反射的方式实例化成配置类,最后加载到IoC容器中。

二、主要注解

springboot应用的启动类上会加上@Sprin

gBootApplication注解,标记该类为springboot应用:

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

其中@SpringBootApplication注解由以下三个注解组成:

  • @SpringBootConfiguration:springboot的配置类,为该spring容器设置配置项;
  • @EnableAutoConfiguration:实现springboot的自动配置的关键,将配置类加载到IoC容器中;
  • @ComponentScan:扫描被@Component、@Service、@Controller加上注解的bean类,默认情况下值扫描同级目录及其子目录下文件;
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {

其中@EnableAutoConfiguration是实现自动配置的关键,其中通过注解@Import加载自动配置的配置项。

@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

其中AutoConfigurationImportSelector类实现了selectImports()的方法就是从配置项中加载配置类;

public class AutoConfigurationImportSelector
      implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
      BeanFactoryAware, EnvironmentAware, Ordered {
      ......
   @Override
   public String[] selectImports(AnnotationMetadata annotationMetadata) {
      //1.判断自动配置是否打开
      if (!isEnabled(annotationMetadata)) {
         return NO_IMPORTS;
      }
      //2.获取所需的配置类
      AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
            .loadMetadata(this.beanClassLoader);
      AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
            autoConfigurationMetadata, annotationMetadata);
      return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
   }

其中getAutoConfigurationEntry()方法会从META-INF/spring.factories 去找对应的配置类,将其实例化。

并不是所有的配置类都会被加载进来,注解@ConditionalOnXXX会根据条件进行筛选;

任何springboot应用中都有spring-boot-autoconfigure ,该类是实现自动配置的关键。

三、主要流程

以下主要描述@EnableAutoConfiguration注解加载配置类的主要流程:

(1)Springboot在启动的时候会加载spring-boot-autoconfiguration依赖中org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件,其中列举了Springboot支持的自动配置类。

(2)根据条件注解加载对于的配置项,在自动配置类中会通过@Conditional等一系列条件注解来判断是否需要加载对于配置类。

(3)加载对于的配置项。将对应的propertis文件里面的配置项加载到Properties实例中,如果项目中通过java或者配置文件的形式做了配置,那么就直接使用该配置的值,否则直接使用默认值。

以下通过SpringBoot加载redis客户端来说明:

spring-boot-autoconfiguration依赖中org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件中存在org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration该自动配置类。

该配置类也在spring-boot-autoconfiguration依赖中,但需要注意的配置类上的几个注解,@ConditionalOnClass({RedisOperations.class})该注解指但存在RedisOperations类时才会自动加载配置类,但该类在spring-data-redis-2.7.1依赖中,亦即存在spring-data-redis-2.7.1依赖时候才会自动加载Redis的自动配置类。

如果存在RedisOperations类,则就会启用RedisProperties里面对应redis的所有属性配置,该配置对于配置文件中加spring.redis前对的配置项。

接着引入@Import({LettuceConnectionConfiguration.class,JedisConnectionConfiguration.class}),表示引入LettuceConnectionConfiguration、JedisConnectionConfiguration两个配置类。最后看到生成redisTemplate和stringRedisTemplate两个bean实例。

这样下来,只要我们引入了redis的客户端依赖,就会自动给我们配置好地址、端口等信息,直接通过redisTemplate调用即可。


参考资料


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
XML Java Maven
Spring Boot自动装配原理
昨天,有位在广州工作4年的小伙伴,在面试中被问到SpringBoot自动装配原理,当时,自我感觉比较好,他要的是30K,但是都没有拿到Offer。今天,我给大家分享一下我的理解。
140 0
|
Java Spring 容器
【Spring Boot自动装配】
【Spring Boot自动装配】
|
5月前
|
Java Spring 容器
在 Spring Boot 中,条件装配(Conditional Configuration)和条件注解(Conditional Annotations)
在 Spring Boot 中,条件装配(Conditional Configuration)和条件注解(Conditional Annotations)
94 1
|
6月前
|
XML Java 数据库
【SpringBoot:详解Bean装配】
【SpringBoot:详解Bean装配】
49 3
|
6月前
|
Java Maven Spring
【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识(下)
【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识(下)
273 0
|
6月前
|
Java Redis 开发者
【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识(上)
【Spring Boot自动装配原理详解与常见面试题】—— 每天一点小知识
230 0
|
6月前
|
Java
SpringBoot之@Conditional衍生条件装配详解
SpringBoot之@Conditional衍生条件装配详解
83 0
【java常见的面试题】讲一讲SpringBoot自动装配的原理
Java基础的面试题【SpringBoot&SpringCloud篇】
110 0
|
6月前
|
XML Java API
Springboot的自动装配解读
Spring Framework本身有一个IOC容器,该容器会统一管理其中的Bean对象,Bean对象可以理解为组件,要理解组件装配,首先要理解组件的概念。
|
6月前
|
存储 Java 开发工具
SpringBoot中Bean的条件装配
本文总结了在SpringBoot中常用的bean装配方法: * profile * conditional * ConditionalOn
69 1