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接口实现类
- 定义一个类继承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;
}
}
- 自定义注解并制定对应的conditional的class
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(MyCondition.class)
public @interface MyConditionAnnotation {
String[] value() default {};
}
- 使用
@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 判断属性值是否一致