文件结构:
1.先编写实体类
public class DependencyBean {
}
2.编写自定义Condition注解并实现自定义Condition类
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Conditional(DependencyCondition.class)
public @interface IfExit {
Class<?> value();
}
public class DependencyCondition implements Condition {
//用来执行匹配,如果返回false,则soring会忽略condition标签下的bean的实例
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
MultiValueMap<String, Object>
attrs=metadata.getAllAnnotationAttributes(IfExit.class.getName());
if(attrs!=null){
for(Object value :attrs.get("value")){
if(context.getBeanFactory().getBeansOfType((Class<?>) value).size()>0){
return true;
}
}
return false;
}
//spring上下文如果存在DependencyBean,则创建当前的bean
return true;
}
}
3.编写Config类:
@Configuration
public class AppConfig {
@Bean
@IfExit(DependencyCondition.class)
public SomeBean someBean() {
return new SomeBean();
}
//如果没有DependencyBean注入,则上面ifExit的DependencyCondition的match方法会返回false
@Bean
public DependencyBean dependencyBean(){
return new DependencyBean();
}
}
4.测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class ConditionTest {
@Autowired
private ApplicationContext ctx;
@Test
public void test() {
//如果spring容器中没有SomeBean,则size为0
System.out.println(ctx.getBeansOfType(SomeBean.class).size() > 0);
}
}