高级装配 —— 条件化的 bean
来源:互联网 发布:山东师范大学知乎 编辑:程序博客网 时间:2024/06/06 04:36
如果希望一个或多个 bean 只有在应用的类路径下包含特定的库时才创建。或者希望某个 bean 只有当另外某个特定的 bean 也声明了之后才会创建。还可能要求只有某个特定的环境变量设置之后,才会创建某个 bean。
Spring 4 之前,很难实现这种级别的条件化配置,但是 Spring 4 引入了一个新的 @Conditional 注解,它可以用到带有 @Bean 注解的方法上。如果给定的条件计算结果为 true,就会创建这个 bean,否则的话,这个 bean 会被忽略。
Q:如何实现条件化 bean?
A:①、条件化地配置 bean
/** * 条件化地配置 bean * 只有设置了 magic 环境属性的时候,Spring 才会实例化这个类。 * 如果环境中没有这个属性,那么 MagicBean 将会被忽略。 * * @Conditional 将会通过 Condition 接口进行条件对比 * 设置给 @Conditional 的类可以是任意实现了 Condition 接口的类。 */ @Bean @Conditional(MagicExistsCondition.class) public MagicBean magicBean(){ return new MagicBean(); }
②、在 Condition 中检查是否存在 magic 属性
import org.springframework.context.annotation.Condition;import org.springframework.context.annotation.ConditionContext;import org.springframework.core.env.Environment;import org.springframework.core.type.AnnotatedTypeMetadata;/** * 实现了 Condition 接口。 */public class MagicExistsCondition implements Condition{ /** * @param context 通过此对象得到 Environment 对象,并使用这个对象检查环境中是否存在名为 magic 的环境属性。 * @param metadata * @return 如果返回 true,则创建带有 @Conditional 注解的 bean;否则,不会创建。 */ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment environment = context.getEnvironment(); // 检查 magic 属性 return environment.containsProperty("magic"); }}
matches() 方法会得到 ConditionContext 和 AnnotatedTypeMetadata 对象用来做出决策。
Q:通过 ConditionContext,我们可以做到什么?
A:做到如下几点:
- 借助 getRegistry() 返回的 BeanDefinitionRegistry 检查 bean 定义;
- 借助 getBeanFactory() 返回的 ConfigurableListableBeanFactory 检查 bean 是否存,甚至探查 bean 的属性;
- 借助 getEnvironment() 返回的 Environment 检查环境变量是否存在以及它的值是什么;
- 读取并探查 getResourceLoader() 返回的 ResourceLoader 所加载的资源;
- 借助 getClassLoader() 返回的 ClassLoader 加载并检查类是否存在。
Q:通过 AnnotatedTypeMetadata ,我们又可以做到什么?
A:能够让我们检查带有 @Bean 注解的方法上还有什么其他的注解。它也是一个接口。
借助 isAnnotated() 方法,我们能够判断带有 @Bean 注解的方法是不是还有其他特定的注解。
借助 其他的那些方法,我们能够检查 @Bean 注解的方法上其他注解的属性。
上一篇:高级装配 —— Spring profile
下一篇:高级装配 —— 如何处理自动装配的歧义性?
阅读全文
0 0
- 高级装配 —— 条件化的 bean
- Spring高级装配--条件化的bean
- Spring装配Bean——高级装配之与环境相关的bean
- Spring实战笔记——Bean的高级装配
- 高级装配 —— 如何在不同的作用域中声明 bean?
- 第三章 高级Bean的装配
- Spring Bean 高级装配
- 装配Bean——隐式的bean发现机制和自动装配
- spring实战-条件装配bean
- spring装配bean——自动装配bean
- Spring装配Bean——Java代码装配bean
- Spring装配Bean——通过配置XML装配bean
- 装配Bean——通过java代码装配bean
- 装配Bean——通过XML装配bean
- 读书笔记-spring高级装配bean
- 高级装配 —— 如何在运行时计算要注入到 bean 属性中的值?
- 学习笔记——Spring的Bean的装配
- Spring的IOC容器—Bean的自动装配
- 每天记录一点 IT技术的进步
- HDU5810(概率)
- spring boot----第一天(初识,搬运官网内容)
- [BZOJ 2124] 等差子序列 Hash+树状数组(附粗略证明)
- 净水市场新发展 慕辰净水推出全屋净水定制
- 高级装配 —— 条件化的 bean
- Android 动画(转)
- 物体定位与检测
- Python两个内置函数——locals 和globals (学习笔记)
- 使用Hibernate 创建数据表时,如何使数据库中的字段的长度和Hibernate映射的长度相等呢?
- ArcGIS Web Adaptor (IIS) 安装指南
- 龟兔赛跑程序模拟
- 双mysql之配置文件my.cnf
- 炎炎夏日最新版Excel导入导出工具类火热出炉