loading...
SpringBoo自动配置
Published in:2022-01-31 | category: Spring
Words: 589 | Reading time: 2min | reading:

Springboot自动配置原理

  • 启动类上面@SpringBootApplication注解依赖于@EnableAutoConfiguration开启自动配置注解,@EnableAutoConfiguration注解底层依赖于@Import,而使用@Import导入的类都会被Spring加载到IOC容器中,

@Import注解有三种使用方式

  • 1.直接加载Bean或配置类(配置类所有的Bean都会注入到IOC容器中)。
  • 2.导入ImportSelector接口的实现类,该实现类会重写父类的selectImports方法,返回一个String[]里面装的是要加载的配置类的全路径。
  • 3.ImportBeanDefinitionRegistrar方式。
  • 而SpringBoot@EnableAutoConfiguration注解依赖的这个@Import底层用的是第二种使用方式,他去加载一个AutoConfigurationImportSelector配置实现类,顶层实现了ImportSelector接口,这个配置类里就重写了selectImports
    方法,这个方法底层调用的是封装好的protected List getCandidateConfigurations(AnnotationMetadata metadata,
    AnnotationAttributes attributes){}方法,加载的是autoconfigre包里META-INF目录下/spring.factories这个配置文件,这个配置文件里定义了大量配置类的全路径,比如RedisAutoConfiguration、RabbitAutoConfiguration等等,当SpringBoot启动时,会自动加载这些配置类来初始化成对应的Bean,而不是所有的Bean都会被初始化,因为这些配置类上都是依赖于@ConditionalOnClass注解,也就是判断你当前环境中是否有对应配置类的字节码文件,也就是看有没有对应的依赖,只有满足Conditional条件的Bean才会被初始化。所以我们一般在使用reids、junit等的时候,导入其依赖,启动springboot后就能@Autowired对象了。

Springboot自定义Starter?

@ConfigurationProperties中prefix=”aaa”,将配置文件中aaa开头的属性映射到该类的字段中。
@ConditionalOnMissingBean(name=”jedis”),如果用户自己定义了名字叫jedis的Bean,那就用用户的,如果用户没有定义,就用我们提供的(name=”jedis”)的Bean。

(1) 创建Starter项目。(2)定义Properties类,让实体类和配置文件相绑定。实体类使用@ConfigurationProperties(prefix=”aaa”)注解,再在自动配置类上加@EnableConfigurationProperties(Properties.class)让Properties类被Spring所识别。(3)定义自动配置类,通过@Bean注解声明要注入的bean对象,并且可以通过参数的方式注入Properties实体类的属性值,他的值就是配置文件里设置的属性值。(4)编写META-INF/spring.factories文件加载自动配置类。

Prev:
Vuex核心概念
Next:
Java并发-理论基础
catalog
catalog