版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MASORL/article/details/82657504
具体步骤
(1)接口
(2)实现接口的类,该类会创建bean
(3)一个实现Condition接口的类,重写matches方法
(4)@Conditional 和@ Bean注解何用,通过matches方法返回的布尔值确定是否创建bean
示例代码
接口:
package com.spring.conditionbean.democondition;
public interface Magic {
void say();
}
接口实现
package com.spring.conditionbean.democondition;
public class MagicBean implements Magic{
public void say(){
System.out.println("no no no");
}
}
Condition接口实现
package com.spring.conditionbean.democondition;
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 MagciExistsCondition implements Condition {
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return true;
// return false;
}
}
配置类,通过 @Conditional(MagciExistsCondition.class)把实现加载进来,根据重写的matches方法的返回值确定要不要创建bean
package com.spring.conditionbean.democondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
@Configuration
public class ConditionConfig {
@Bean
@Conditional(MagciExistsCondition.class)
public Magic magic() {
return new MagicBean();
}
}
测试:这次使用了ApplcationContext来测试是否创建了bean。
Application.containsBean()方法判断是否含有名为magic的bean
asserTrue(boolean condition):如果condition为false,将会抛出AssertionError。如果为true,什么也不会发生
package com.spring.conditionbean.democondition;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConditionConfig.class)
public class MagciExistsTest {
@Autowired
private ApplicationContext context;
@Test
public void shouldNotBeNull(){
assertTrue(context.containsBean("magic"));
}
}
补充一: 关于matches方法的第一个参数ConditionContext
源码如下
public interface ConditionContext {
//通过返回的BeanDefinitionRegistry检查bean定义
BeanDefinitionRegistry getRegistry();
//通过返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性
ConfigurableListableBeanFactory getBeanFactory();
//)通过返回的Environment检查环境变量是否存在以及它的值是什么;
Environment getEnvironment();
//通过返回的ResourceLoader所加载的资源;
ResourceLoader getResourceLoader();
//通过返回的ClassLoader加载并检查类是否存在。
ClassLoader getClassLoader();
}
补充二:关于matches方法的第二个参数AnnotatedTypeMetadata
源码如下
public interface AnnotatedTypeMetadata {
//检查带有@Bean注解的方法是不是还有其他特定的注解
boolean isAnnotated(String var1);
//其余的都是用来获取其他注解的属性
Map<String, Object> getAnnotationAttributes(String var1);
Map<String, Object> getAnnotationAttributes(String var1, boolean var2);
MultiValueMap<String, Object> getAllAnnotationAttributes(String var1);
MultiValueMap<String, Object> getAllAnnotationAttributes(String var1, boolean var2);
}
嗯~有机会研究一下。