设为首页 加入收藏

TOP

Autoconfiguration详解(一)
2023-07-25 21:33:54 】 浏览:70
Tags:Autoconfiguration 详解

Autoconfiguration详解——自动注入配置参数

一、 理解自动装配bean

1. 常用注解

  1. @AutoConfiguration(每个配置类都要加上)
    1. Class<?>[] after() default {};
    2. Class<?>[] before() default {};
    3. 以上两个配置可以控制加载顺序;
    4. 不需要再增加@Configuration注解;
  2. @AutoConfigureBefore and @AutoConfigureAfter
  3. @Configuration
  4. @Conditional(后面会详细讲到)
    1. @ConditianalOnClass
    2. @ConditionalOnMissingClass
    3. @ConditionalOnWebApplication:只在web应用中加载;
  5. @EnableConfigurationProperties:配置文件参数内容,参照类RedisProperties;
    1. @ConfigurationProperties(prefix = "spring.redis"),该注解展示了配置文件前缀;
  6. @DependsOn:列举一些前置的注入bean,以备用,用在类上需要有 @Component自动扫描的时候才能生效;
    1. 实际上控制了bean加载的顺序,优先加载指定的bean,然后加载当前bean;
    2. 销毁的时候,注解的bean优先与于依赖的bean销毁;

2. 定位自动装配的候选类

springboot 框架会自动扫描 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 进行引入,所以需要自动注入的Configuration文件都写在这个文件中。每个class一行。

这里本质上是一个自动版的@Import。

示例:

# comments
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration

如果需要引入特定的Component,使用@Import注解。

3. 条件注解

在所有自动装配类出现的地方,我们都因该时加上@Conditional注解,允许使用的开发人员覆盖自动装配的bean,当然他们也可以选择什么也不做,使用默认的配置。

Spring Boot 提供了一些条件注解,可以注解在@Configuration类或者@Bean方法上。

3.1 有关类的判断

对于@Configuration类来说,@ConditionalOnClass@ConditionalOnMissingClass代表了在指定类存在或者不存在的时候进行加载。因为实际上注解的元数据使用ASM技术进行解析,所以可以使用value参数来指定特定的类的class对象(可以是多个),或者使用name参数来指定特定的类名(可以是多个),两种方式所指向的类即使不存在也不影响正常执行。

@Bean方法返回值是条件注解的的目标之时,可能会因为JVM加载顺序的问题导致加载失败,上文提到的两个注解可以用在@Bean方法上。

3.2 有关bean的判断

@ConditionalOnBean@ConditionalOnMissingBean,代表在指定bean存在或者不存在时加载。value参数可以指定bean的class(多个),name可以指定bean的名称(多个)。search参数允许你限制ApplicationContext即应用上下文的搜索范围,可选当前上下文,继承上层,或者是全部(默认)。

@Bean方法上使用时,默认参数为当前方法返回类型。

在使用@Bean注解时,建议使用具体类型而不是父类型进行指代。

3.3 配置条件

@ConditionalOnProperty,指定配置项文件(例如dev,pro),prefix属性规定了配置前缀,name属性指定了应该被检查的参数。默认,所有存在且不等于false的参数都会被匹配到,你也可以使用havingValuematchIfMissing属性闯将更多的校验。

例子:@ConditionalOnProperty(name = "spring.redis.client-type", havingValue = "lettuce", matchIfMissing = true);

属性名 类型 解析
name String[] name() default {}; 配置项全称,如果有prefix,可以省略prefix中的前缀部分
prefix String prefix() default ""; 统一的配置项前缀
havingValue String havingValue() default ""; 配置项需要匹配的内容,如果没有指定,那么配置的值等于false时结果为false,否则结果都为true
matchIfMissing boolean matchIfMissing() default false; 配置项不存在时的配置,默认为false

3.4 源文件条件

@ConditionalOnResource,指定源文件存在时引入。

例如:@ConditionalOnResource(resources = {"classpath:test.log"});

3.5 web 应用条件

@ConditionalOnWebApplication@ConditionalOnNotWebApplication ,web应用或者不是web应用时启用,以下部分只要满足一个条件即为web 应用。

servlet-based web 应用特点:

  1. 使用 Spring Web
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇CountDownLatch、CyclicBarrier .. 下一篇Java19新特性

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目