1. 条件注解
如果注解指定的条件成立,则触发指定行为
@ConditionalOnXxx
@ConditionalOnClass
:如果类路径中存在这个类,则触发指定行为
@ConditionalOnMissingClass
:如果类路径中不存在这个类,则触发指定行为
@ConditionalOnBean
:如果容器中存在这个Bean(组件),则触发指定行为
@ConditionalOnMissingBean
:如果容器中不存在这个Bean(组件),则触发指定行为
场景:
- 如果存在
FastsqlException
这个类,给容器中放一个Cat组件,名cat01,
- 否则,就给容器中放一个Dog组件,名dog01
- 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan
- 否则,就放一个User,名叫lisi
@ConditionalOnBean(value=组件类型,name=组件名字)
:判断容器中是否有这个类型的组件,并且名字是指定的值
新建配置类:
package com.example.boot.conf;
// import com.alibaba.druid.FastsqlException;
import com.example.boot.Pojo.Cat;
import com.example.boot.Pojo.Dog;
import com.example.boot.Pojo.User;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Import;
@SpringBootConfiguration
public class AppConfig2 {
@ConditionalOnClass(name = "com.alibaba.druid.FastsqlException")
@Bean
public Cat cat01() {
return new Cat();
}
@ConditionalOnMissingClass(value = "com.alibaba.druid.FastsqlException")
@Bean
public Dog dog01() {
return new Dog();
}
@ConditionalOnBean(value = Dog.class)
@Bean
public User zhangsan() {
return new User();
}
@ConditionalOnMissingBean(value = Dog.class)
@Bean
public User lisi() {
return new User();
}
}
主程序
@SpringBootApplication
public class Boot302DemoApplication {
public static void main(String[] args) {
var ioc = SpringApplication.run(Boot302DemoApplication.class, args);
for (String cat : ioc.getBeanNamesForType(Cat.class)) {
System.out.println("cat :" + cat);
}
for (String dog : ioc.getBeanNamesForType(Dog.class)) {
System.out.println("dog :" + dog);
}
for (String user : ioc.getBeanNamesForType(User.class)) {
System.out.println("user :" + user);
}
}
}
注意: 判断有无 FastsqlException
的时候,需要在 pom.xml
文件中将其注释
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
@ConditionalOnRepositoryType (org.springframework.boot.autoconfigure.data)
@ConditionalOnDefaultWebSecurity (org.springframework.boot.autoconfigure.security)
@ConditionalOnSingleCandidate (org.springframework.boot.autoconfigure.condition)
@ConditionalOnWebApplication (org.springframework.boot.autoconfigure.condition)
@ConditionalOnWarDeployment (org.springframework.boot.autoconfigure.condition)
@ConditionalOnJndi (org.springframework.boot.autoconfigure.condition)
@ConditionalOnResource (org.springframework.boot.autoconfigure.condition)
@ConditionalOnExpression (org.springframework.boot.autoconfigure.condition)
@ConditionalOnClass (org.springframework.boot.autoconfigure.condition)
@ConditionalOnEnabledResourceChain (org.springframework.boot.autoconfigure.web)
@ConditionalOnMissingClass (org.springframework.boot.autoconfigure.condition)
@ConditionalOnNotWebApplication (org.springframework.boot.autoconfigure.condition)
@ConditionalOnProperty (org.springframework.boot.autoconfigure.condition)
@ConditionalOnCloudPlatform (org.springframework.boot.autoconfigure.condition)
@ConditionalOnBean (org.springframework.boot.autoconfigure.condition)
@ConditionalOnMissingBean (org.springframework.boot.autoconfigure.condition)
@ConditionalOnMissingFilterBean (org.springframework.boot.autoconfigure.web.servlet)
@Profile (org.springframework.context.annotation)
@ConditionalOnInitializedRestarter (org.springframework.boot.devtools.restart)
@ConditionalOnGraphQlSchema (org.springframework.boot.autoconfigure.graphql)
@ConditionalOnJava (org.springframework.boot.autoconfigure.condition)
以上注解可以使用在类和方法上