SpringBoot Starter解析

conditional注解解析

介绍

  • 基于条件的注解
  • 作用: 根据是否满足某一个特定条件决定是否创建某个特定的bean
  • 意义: Springboot实现自动配置的关键基础能力

常见的conditional注解

  • @ConditionalOnBean: 当容器中存在某个Bean才会生效
  • @ConditionalOnMissingBean: 不存在某个Bean才会生效
  • @ConditionalOnClass: 某个Class是否存在, 存在才会生效
  • @ConditionalOnMissingClass: 某个Class不存在才会生效
  • @ConditionalOnWebApplication: 是否处于一个Web环境
  • @ConditionalOnNotWebApplication: 不处于Web环境
  • @ConditionalOnProperty: 当前我们的框架当中是否包含特定的属性
  • @ConditionalOnJava: 当前是否处于某个特定的Java版本

自定义一个conditional注解

  • 实现一个自定义注解并且引入Conditional注解
  • 实现Condition接口重写matches方法,符合条件返回true
  • 自定义注解引入Condition接口实现类

  1. 定义一个类继承condition类
public class MyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String[] properties = (String[])metadata.getAnnotationAttributes("com.mooc.sb2.condi.MyConditionAnnotation").get("value");
        for (String property : properties) {
            if (StringUtils.isEmpty(context.getEnvironment().getProperty(property))) {
                return false;
            }
        }
        return true;
    }
}
  1. 自定义注解并制定对应的conditional的class
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface MyConditionAnnotation {

    String[] value() default {};

}
  1. 使用
@Component
//@ConditionalOnProperty("com.mooc.condition")
@MyConditionAnnotation({"com.mooc.condition1", "com.mooc.condition2"})
public class A {
}

配置属性就可以正常注入对应的Bean了

动手搭建starter

介绍

  • 简介: 可插拔插件
  • 与jar包区别:starter能实现自动配置
  • 作用: 大幅提升开发效率

新建starter步骤

引入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

新建自动配置类:

@Configuration
@EnableConfigurationProperties(WeatherSource.class)
@ConditionalOnProperty(name = "weather.enable", havingValue = "enable")
public class WeatherAutoConfiguration {

    @Autowired
    private WeatherSource weatherSource;

    @Bean
    @ConditionalOnMissingBean(WeatherService.class)
    public WeatherService weatherService() {
        return new WeatherService(weatherSource);
    }

}

spring.factories中添加对应的自动装配类实现

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.louye.weather.WeatherAutoConfiguration

修改对应的artifictId为规范的命名

最后构建打包, build success 即表示打包成功

使用starter步骤

引入自定义的starter

<dependency>
    <groupId>com.louye</groupId>
    <artifactId>weather-spring-boot-starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

配置属性:

注入对应的服务并进行调用即可:

starter原理解析

starter自动配置类的导入

starter自动配置类过滤

面试题

  • 请介绍下你熟悉的conditional注解?
  • 回答下conditional注解的原理?
  • Springboot starter有什么作用?你熟悉哪些?
  • 你有没有尝试过动手搭建starter?
  • starter中的自动配置类是如何被引入到框架中?
    • @SpringBootApplication + @AutoConfigurationImportSeletor 引入
  • starter中自动配置类生效原理?
    • @ConditionalOnProperties过滤
    • OnPropertyCondition.getMatchOutcome 判断属性值是否一致

相关推荐

  1. InterLM代码

    2024-03-25 05:48:01       32 阅读
  2. UV、PV

    2024-03-25 05:48:01       37 阅读
  3. Yaml语法

    2024-03-25 05:48:01       58 阅读
  4. Spring aspect

    2024-03-25 05:48:01       35 阅读
  5. thinkphp 模板

    2024-03-25 05:48:01       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-25 05:48:01       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-25 05:48:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-25 05:48:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-25 05:48:01       18 阅读

热门阅读

  1. 【几何】平面方程

    2024-03-25 05:48:01       17 阅读
  2. temu电商按关键字搜索temu商品 API

    2024-03-25 05:48:01       18 阅读
  3. RAG - QA + Qwen + dashscope

    2024-03-25 05:48:01       17 阅读
  4. 【Linux基础】dash和bash简介

    2024-03-25 05:48:01       18 阅读
  5. C#面:简述 LINQ

    2024-03-25 05:48:01       17 阅读
  6. List整理

    2024-03-25 05:48:01       20 阅读
  7. 进程和线程的区别

    2024-03-25 05:48:01       18 阅读