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的主要内容,如果未能解决你的问题,请参考以下文章