@Conditional 的学习
1、@Conditional 的用的方式
放在类上或者方法上
2、@Conditional 的作用
- 用在方法上让用@Conditional的方法返回的bean是否生效,判断依据是@Conditional注解的属性写的类中matchs方法的返回值。
- 用在类上让用@Conditional的类以及如果类里面的有bean的话是否让bean生效()判断依据是@Conditional注解的属性写的类中matchs方法的返回值
3、@Conditional 用在方法上
3.1 定义一个Condition
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class LinuxSystem implements Condition {
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
ConfigurableListableBeanFactory configurableListableBeanFactory = conditionContext.getBeanFactory();
Environment environment = conditionContext.getEnvironment();
ClassLoader classLoader = conditionContext.getClassLoader();
//获取bean定义的注册类
BeanDefinitionRegistry beanDefinitionRegistry = conditionContext.getRegistry();
//判断是否注册了某个bean
beanDefinitionRegistry.containsBeanDefinition("person");
String property = environment.getProperty("os.name");
if(property.contains("Mac")){
return true;
}
return false;
}
}
3.2 使用Condition
@Configuration
public class MainConfig {
/**
*
*
* 如果是linux 系统就注册 person1
* @return
*/
@Bean("person1")
@Conditional(LinuxSystem.class)
public Person person(){
Person p= new Person(12,"gaohq");
return p;
}
}
4、放在类上
4.1 放在配置类上
/**
*
* Conditional 用在类上意思是LinuxSystem 接口返回的值是true就生效
*/
@Conditional(LinuxSystem.class)
@Configuration
public class MainConfig {
/**
*
*
* 如果是linux 系统就注册 person1
* @return
*/
@Bean("person1")
@Conditional(LinuxSystem.class)
public Person person(){
Person p= new Person(12,"gaohq");
return p;
}
}
4.2 用在普通的类上
@Conditional(WindowsSystem.class)
@Component
public class Person {
private int age;
private String name;
// public Person(int age, String name) {
// this.age = age;
// this.name = name;
// }
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
5、测试
public class TestA {
public static void main(String[] args) {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
String[] strings = annotationConfigApplicationContext.getBeanDefinitionNames();
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
}
}
}
6、@Conditional 常见的派生注解
在SpringBoot中这样的派生注解有很多,这里用常见的几个举例来说明
6.1 @ConditionalOnBean
import com.ali.gts.provider.facade.provider.domain.Pet; import com.google.inject.internal.cglib.proxy.$MethodProxy; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //1、告诉SpringBoot 这是一个配置类== 原来的配置文件 //2、并且这个配置类也是一个组件 // @Configuration public class MyConfig { @ConditionalOnBean(name = "user") //当容器里面有叫user 这个组件时当前组件才会注册到Spring容器里面 @Bean //给容器中添加组件,默认id是方法名,默认是单实例的 public Pet tomcatPet(){ return new Pet("tomcat"); } } //1、返回我们的IOC容器 ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(ProviderApplication.class, args); System.err.println(configurableApplicationContext.containsBean("tomcatPet"));
6.2 @ConditionalOnMissingBean
import com.ali.gts.provider.facade.provider.domain.Pet; import com.google.inject.internal.cglib.proxy.$MethodProxy; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; //1、告诉SpringBoot 这是一个配置类== 原来的配置文件 //2、并且这个配置类也是一个组件 // @Configuration public class MyConfig { /** * 1、可以用在方法上 * 当容器里面没有有叫user 这个组件时当前组件才会注册到Spring容器里面 * 2、可以用在类上 * 当容器里面没有有叫user 当前类里面注册的bean 才会放到Spring容器里面 * */ @ConditionalOnMissingBean(name = "user") @Bean //给容器中添加组件,默认id是方法名,默认是单实例的 public Pet tomcatPet(){ return new Pet("tomcat"); } }
浙公网安备 33010602011771号