SpringAction学习二、高级装配:条件化的bean

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MASORL/article/details/82657504

具体步骤

(1)接口

(2)实现接口的类,该类会创建bean

(3)一个实现Condition接口的类,重写matches方法

(4)@Conditional 和@ Bean注解何用,通过matches方法返回的布尔值确定是否创建bean

示例代码

接口:

package com.spring.conditionbean.democondition;

public interface Magic {
    void say();
}

接口实现

package com.spring.conditionbean.democondition;

public class MagicBean implements Magic{
    public void say(){
        System.out.println("no no no");
    }
}

Condition接口实现

package com.spring.conditionbean.democondition;


import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class MagciExistsCondition implements Condition {
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
      return true;
     // return false;
    }
}

配置类,通过   @Conditional(MagciExistsCondition.class)把实现加载进来,根据重写的matches方法的返回值确定要不要创建bean

package com.spring.conditionbean.democondition;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
public class ConditionConfig {
    @Bean
    @Conditional(MagciExistsCondition.class)
    public Magic magic() {
        return new MagicBean();
    }
}

测试:这次使用了ApplcationContext来测试是否创建了bean。

Application.containsBean()方法判断是否含有名为magic的bean

asserTrue(boolean condition):如果condition为false,将会抛出AssertionError。如果为true,什么也不会发生

package com.spring.conditionbean.democondition;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConditionConfig.class)
public class MagciExistsTest {
    @Autowired
    private ApplicationContext context;
    
    @Test
    public void shouldNotBeNull(){
        assertTrue(context.containsBean("magic"));
    }
}

补充一: 关于matches方法的第一个参数ConditionContext

源码如下

public interface ConditionContext {

//通过返回的BeanDefinitionRegistry检查bean定义
    BeanDefinitionRegistry getRegistry();

//通过返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性
    ConfigurableListableBeanFactory getBeanFactory();

//)通过返回的Environment检查环境变量是否存在以及它的值是什么;
    Environment getEnvironment();

//通过返回的ResourceLoader所加载的资源;
    ResourceLoader getResourceLoader();

//通过返回的ClassLoader加载并检查类是否存在。
    ClassLoader getClassLoader();
}

补充二:关于matches方法的第二个参数AnnotatedTypeMetadata

源码如下

public interface AnnotatedTypeMetadata {

//检查带有@Bean注解的方法是不是还有其他特定的注解
    boolean isAnnotated(String var1);

//其余的都是用来获取其他注解的属性
    Map<String, Object> getAnnotationAttributes(String var1);

    Map<String, Object> getAnnotationAttributes(String var1, boolean var2);

    MultiValueMap<String, Object> getAllAnnotationAttributes(String var1);

    MultiValueMap<String, Object> getAllAnnotationAttributes(String var1, boolean var2);
}

嗯~有机会研究一下。

猜你喜欢

转载自blog.csdn.net/MASORL/article/details/82657504