条件化的bean
当你希望一个或者多个bean只有在应用的的类路径下包含特殊的库才创建。或者希望一个bean只有在只有在某个特定的bean也申明了之后才会创建。
在spring4 这很难实现,在Spring4之后,引入了一个全新的@Condition注解,它可以用到带有@Bean注解的方法上。如果计算的结果为TRUE,就会创建这个bean,否则的话,这个bean就会被忽略。
@Condition结束
@Condition的类可以是实现了Condition接口的类型,只需要提供matches()方法的实现即可。如果matches()方法返回true,就会创建带有@Condition注解的bean,否则,相反。
示例代码
package com.lf.config;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Created by LF on 2017/5/1.
*/
public class MyConditional implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
boolean containsProperty = environment.containsProperty("Str");//包含str的属性
return containsProperty;
}
}
ConditionContext介绍
通过ConditionContext,我们可以做到以下几点:
- 借助getRegistry(),检查bean的定义
- 借助getBeanFactory(),检查bean是否存在
- getEnvironment(),返回环境变量是否存在以及,它的值是什么
- getResourceLoader(),返回所加载的资源
- getClassLoader(),加载并检查类是否存在
AnnotatedTypeMetadata介绍
- isAnnotated(String annotationName);判断带有@bean注解的方法是不是还有其他的注解。
完整示例
创建一个服务的接口
package com.lf.service;
/**
* Created by LF on 2017/5/1.
*/
public interface PlayService {
void singer();
}
服务的实现
package com.lf.service.impl;
import com.lf.config.MyConditional;
import com.lf.service.PlayService;
import org.springframework.context.annotation.Conditional;
import org.springframework.stereotype.Component;
/**
* Created by LF on 2017/5/1.
*/
@Conditional(MyConditional.class)
@Component
public class PlayServiceImpl implements PlayService {
@Override
public void singer() {
System.err.println("唱歌");
}
}
条件注解
package com.lf.config;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Created by LF on 2017/5/1.
*/
public class MyConditional implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
boolean containsProperty = environment.containsProperty("Str");//包含str的属性
return containsProperty;
}
}
只有当环境变量中存在Str的变量的时候,才会创建PlayServiceImpl