SpringBoot Starter解析

本文详细介绍了SpringBoot中基于条件的注解如何决定bean的创建,包括内置的如`@ConditionalOnBean`、`@ConditionalOnMissingBean`等,以及如何自定义条件。还探讨了SpringBootStarter的作用,以及自动配置类的导入、过滤和生效原理。
摘要由CSDN通过智能技术生成

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 判断属性值是否一致
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值