Spring学习笔记(条件化的Bean)
《Spring in Action(4th Edition)》 学习笔记:备查。
使用@Conditional注解可以条件化地创建Bean。
设置给@Conditional的类可以是任意实现了Condition接口的类型,需要实现Condition接口的matches()方法。matches()返回true时创建MagicBean,返回false时不创建。
使用示例:
@Bean @Conditional(MagicExistsCondition.class) public MagicBean magicBean() { return new MagicBean(); }
package com.habuma.restfun; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.env.Environment; public class MagicExistsCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Environment env = context.getEnvironment(); return env.containsProperty("magic"); } }
ConditionContext是一个接口,源码如下:
package org.springframework.context.annotation; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.core.env.Environment; import org.springframework.core.io.ResourceLoader; import org.springframework.lang.Nullable; public interface ConditionContext { BeanDefinitionRegistry getRegistry(); @Nullable ConfigurableListableBeanFactory getBeanFactory(); Environment getEnvironment(); ResourceLoader getResourceLoader(); @Nullable ClassLoader getClassLoader(); }
ConditionContext各个方法的作用为:
1. 借助getRegistry()返回的BeanDefinitionRegistry检查bean定义;
2. 借助getBeanFactory()返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性;
3. 借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么;
4. 读取并探查getResourceLoader()返回的resourceLoader所加载的资源;
5. 借助getClassLoader()返回的ClassLoader加载并检查类是否存在。
AnnotatedTypeMetadata接口则能够让我们检查带有@Bean注解的方法上还有什么其他的注解。
代码如下:
package org.springframework.core.type; import java.util.Map; import org.springframework.lang.Nullable; import org.springframework.util.MultiValueMap; public interface AnnotatedTypeMetadata { boolean isAnnotated(String var1); @Nullable Map<String, Object> getAnnotationAttributes(String var1); @Nullable Map<String, Object> getAnnotationAttributes(String var1, boolean var2); @Nullable MultiValueMap<String, Object> getAllAnnotationAttributes(String var1); @Nullable MultiValueMap<String, Object> getAllAnnotationAttributes(String var1, boolean var2); }
借助isAnnotated()方法,能够判断带有@Bean注解的方法是不是还有其他特定的注解。借助其他方法能检查@Bean注解的方法上其他注解的属性。