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注解的方法上其他注解的属性。

posted @ 2018-11-05 13:54  天南星2018  阅读(185)  评论(0编辑  收藏  举报