Spring 实战-第三章-条件化的bean

Posted Lv Jianwei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 实战-第三章-条件化的bean相关的知识,希望对你有一定的参考价值。

在使用的时候,某些bean需要在某些特定条件化才能实例化,spring中使用的@Condition注解实现这个功能。

1.接口

package main.java.soundsystem;
public interface CompactDisc {
    void play();
}

2.实现

package main.java.soundsystem;

import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;

@Component
@Profile("dev")
public class SgtPepper implements CompactDisc {
    private String title ="Sgt. Pepper‘s Lonely Hearts Club Band";
    private String artist="The Beatles";
    @Override
    public void play() {
        System.out.println("Playing "+ title +" by "+artist);
    }
}

3.增加Condition实现类,需要实现Condition接口的matches方法,

方法返回true,表示使用这个条件的bean满足条件可创建,返回false,表示条件不满足,无法创建

package main.java.soundsystem;

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

public class SgtPepperCondition implements Condition {

    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return true;
    }
}

ConditionContext是一个接口,大致如下

public interface ConditionContext {
    BeanDefinitionRegistry getRegistry();
    ConfigurableListableBeanFactory getBeanFactory();
    Environment getEnvironment();
    ResourceLoader getResourceLoader();
    ClassLoader getClassLoader();
}

通过ConditionContext可以做到如下几点:

  • 借助getRegistry()返回的BeanDefinitionRegistry检查bean定义;
  • 借助getBeanFactroy()返回的ConfigurationListableBeanFactory检查bean是否存在,甚至探查bean的属性;
  • 借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么;
  • 读取并探查getResourceLoader()返回的ResourceLoader所加载的资源;
  • 借助getClassLoader()返回的ClassLoader加载并检查类是否存在。

4.配置增加条件

package main.java.soundsystem;
import org.springframework.context.annotation.*;

@Configuration
//@ComponentScan
public class CDPlayerConfig {

    @Bean
    @Conditional(SgtPepperCondition.class)
    @Profile("dev")
    public CompactDisc sgtPeppers() {
        return new SgtPepper();
    }

}

5.测试

package main.java.soundsystem;

import static org.junit.Assert.*;

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {CDPlayerConfig.class})
@ActiveProfiles("dev")
public class CDPlayerTest {
    @Autowired
    private CompactDisc cd;

    @Test
    public void cdShouldNotBeNull() {
        assertNotNull(cd);
        cd.play();
    }

}

 

以上是关于Spring 实战-第三章-条件化的bean的主要内容,如果未能解决你的问题,请参考以下文章

Spring高级装配 条件化的bean

第三章 高级装配

Spring Boot实战笔记-- Spring高级话题(条件注解@Conditional)

《Spring实战 第三版》二

Spring实战Spring中条件化地创建bean

Spring bean管理器 bean实例化的三种方式