• 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();
        }
    
    }
  • 相关阅读:
    next_permutation函数(全排列)
    滚动数组
    多重背包问题
    ubuntu12.04硬盘安装
    UBUNTU12.04下安装配置体验gnome3
    给Ubuntu安装KDE桌面 [转]
    Ubuntu 13.04 用户安装 gnome 3.8 桌面
    ubuntu下安装wine
    ubuntu 安装输入法(fcitx)
    js 对url进行编码和解码的三种方式
  • 原文地址:https://www.cnblogs.com/lvjianwei/p/7464571.html
Copyright © 2020-2023  润新知