zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }
  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/lvjianwei/p/7464571.html
Copyright © 2011-2022 走看看