目录
一 @ConditionalOnClass和@ConditionalOnMissingClass
1.2 @ConditionalOnMissingClass
导springboot的坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.5.4</version>
</dependency>
一 @ConditionalOnClass和@ConditionalOnMissingClass
1.1 @ConditionalOnClass
@ConditionalOnClass → 如果有属性里的 class就加载对应的bean
package com.qing.config;
import com.qing.bean.Cat;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
public class SpringConfig1 {
@Bean
//@ConditionalOnClass :如果有属性里的 class就加载方法返回的cat bean
// @ConditionalOnClass(Mouse.class)
@ConditionalOnClass(name="com.qing.bean.Mouse")
public Cat cat(){
return new Cat();
}
}
结果:有mouse 类 所以加载cat bean
1.2 @ConditionalOnMissingClass
@ConditionalOnMissingClass → 如果没有属性里的class才加载对应的bean
package com.qing.config;
import com.qing.bean.Cat;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
public class SpringConfig1 {
@Bean
//@ConditionalOnMissingClass :如果没有属性里的 class就加载方法返回的cat bean
@ConditionalOnMissingClass("com.qing.bean.Mouse")
public Cat cat(){
return new Cat();
}
}
结果:有mouse 类 所以不加载cat bean
二 @ConditionalOnBean
使用位置1
@ConditionalOnBean → 如果spring容器里有属性里写的bean,就加载对应的bean
package com.qing.config;
import com.qing.bean.Cat;
import com.qing.bean.Mouse;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
@Import(Mouse.class)
public class SpringConfig2 {
@Bean
@ConditionalOnBean(Mouse.class)
public Cat cat(){
return new Cat();
}
}
结果:
spring容器里有mouse bean,所以加载了cat bean
改一下
spring容器里没有mouse bean了,所以不加载cat bean
使用位置2
spring容器中有jerry就有cat
package com.qing.bean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication;
import org.springframework.stereotype.Component;
@Component
@ConditionalOnBean(name = "jerry")
//@ConditionalOnNotWebApplication
public class Cat {
}
package com.qing.bean;
import org.springframework.stereotype.Component;
@Component("jerry")
public class Mouse {
}
package com.qing.config;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan("com.qing.bean")
public class SpringConfig3 {
}
结果
spring容器中没有jerry就没有cat
@ConditionalOn.. 注解还有很多,都是不仅可以用在方法上,还可以直接用在类上
总结
有mouse 类就返回cat bean
多个 condition的条件是叠加的,&的关系
有mouse 类,并且没有wolf 类就返回cat bean
spring容器里有mouse bean就返回cat bean
spring容器里有mouse bean就返回cat bean
spring容器里有名字叫jerry的bean就返回cat bean
有mouse的类并且没有dog类,并且非web环境 就返回 cat bean
有jdbc driver类时才加载druidSource → 自适应加载