1. 程式人生 > >Spring 實戰-第三章-條件化的bean

Spring 實戰-第三章-條件化的bean

reg itl tcl span init bsp 測試 art port

在使用的時候,某些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