这篇文章主要讲解了Spring基于@Conditional条件化装配bean的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。
目前创新互联公司已为数千家的企业提供了网站建设、域名、网页空间、网站托管、企业网站设计、沈阳网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
一 前言
理解spring的如何根据条件装配bean有助于我们更好使用springboot进行开发,和源码理解;
二 @Conditional 装配bean
思路如下
Spring中提供了@Conditional注解实现条件化是否装配bean,这样可以根据条件动态的装配bean;
要判定@Conditional 注解是否该装配bean还需要Condition 接口配合,我们只须实现 Condition 接口,重写matches 方法;
根据matches方法返回的布尔值进行判定@Conditional是否需要装配bean
实现过程如下
2.1 用户类
用户类用于配置类是否装配该Bean
/** * @Author lsc **/ public class User { private String userName; // 省略 set get }
2.2 Condition实现类
RuntimeExist 实现 Condition ,使用 conditionContext 获取jvm 环境变量,如果存在则返回 true ,否则返回false;其中conditionContext还有如下方法
- getRegistry():使用BeanDefinitionRegistry的检查bean定义;
- getBeanFactory():使用ConfigurableListableBeanFactory检查bean是否存在;
- getEnvironment():Environment环境变量
- getResourceLoader():ResourceLoader加载的资源;
- getClassLoader():ClassLoader加载的类。
public class RuntimeExist implements Condition { public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { // 获取jvm 运行时环境 Environment environment = conditionContext.getEnvironment(); // 检查 jvm 运行时环境是否存在属性 return environment.containsProperty("java.runtime.name"); } }
2.3 用户配置类
根据 RuntimeExist的 matches 方法的返回值 是否装配bean; 这边设置了属性名称 zszxz,以便于更好的测试;
/** * @Author lsc **/ @Configuration public class UserConfig { @Bean // 根据 RuntimeExist的 matches 方法的返回值 是否装配bean @Conditional(RuntimeExist.class) public User user(){ User user = new User(); user.setUserName("zszxz"); return user; } }
2.4 测试
由于 jvm 运行时环境存在 java.runtime.name 属性 ,故会装配成功,会打印出 zszxz ;
如果将 java.runtime.name 改为 任意jvm 运行时不存在的属性 ,测试就会报异常;
@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文 @ContextConfiguration(classes= UserConfig.class)//加载配置类 public class ConditionTest { @Autowired User user; @Test public void test(){ // zszxz System.out.println(user.getUserName()); } }
看完上述内容,是不是对Spring基于@Conditional条件化装配bean的方法有进一步的了解,如果还想学习更多内容,欢迎关注创新互联行业资讯频道。
分享名称:Spring基于@Conditional条件化装配bean的方法
文章链接:http://lswzjz.com/article/jpjdgp.html