1 EnableAutoConfiguration
如果我们想自己写一个框架,并希望springboot加载时可以将我们自己框架的一些配置加载,那么该怎么做呢。
肯定不能直接让用户在 scanBasePackages 中将我们的包加进去。
这里我们需要用到@EnableAutoConfiguration 注解,这个注解的是自动配置,如果做到自动配置呢?
springboot 在启动是会扫描所有路径下的 META-INF/spring.factories 文件,找到该文件下 key为
org.springframework.boot.autoconfigure.EnableAutoConfiguration,然后会自动加载value 对应对的class 类。
具体文件路径如下:
然后我们看下spring.factories 文件内容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.test.MyConfig
MyConfig 内容:
public class MyConfig {
public MyConfig(){
System.out.println("myconfig 初始化");
}
}
启动springboot,可以看到 控制台打印 myconfig 初始化
一般我们将这个自动配置的类都写到一个包含starter 中的项目里。
我们看一下springcloud erueka 中的自动配置jar 包
2 Condition
它可以根据代码中设置的条件装载不同的bean,比如说当一个接口有两个实现类时,我们要把这个接口交给Spring管理时通常会只选择实现其中一个实现类,这个时候我们总不能使用if-else吧,所以这个@Conditional的注解就出现了。
- @ConditionalOnMissingBean(name = “connectionFactory”)或者
- @ConditionalOnMissingBean(annotation = EnableSyjRateLimit.class)根据注解等等骚操作都可以
- @ConditionalOnMissingBean这个仅仅比1多了个Missing,啥意思呢,见名知意,就是不存在某个bean的时候实例化。
- @ConditionalOnClass(存在某个类时,才会实例化一个Bean)
- @ConditionalOnMissingClass(不存在某个类时,才会实例化一个Bean)
- @ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “token”)这个就稍微复杂了一点,它的意思呢就是当存在配置文件中以syj为前缀的属性,属性名称为algorithm,然后它的值为token时才会实例化一个类。而且这个还有一个比较好的属性@ConditionalOnProperty(prefix = “syj”, name = “algorithm”, havingValue = “counter”, matchIfMissing = true)matchIfMissing的意思呢就是说如果所有的都不满足的话就默认实现,不管这个属性syj.algorithm是不是等于counter
- @ConditionalOnJava(如果是Java应用)
- @ConditionalOnWebApplication(如果是Web应用)
大致有一下几种:
、
自己实现:
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false;
}
}
使用:
@Conditional(MyCondition.class)