峰哥说技术: 05-Spring Boot条件注解注解 Posted 2020-11-27 027kgc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了峰哥说技术: 05-Spring Boot条件注解注解相关的知识,希望对你有一定的参考价值。
Spring Boot深度课程系列
峰哥说技术— 2020庚子年重磅推出、战胜病毒、我们在行动
05 峰哥说技术 Spring Boot条件注解
@EnableAutoConfiguration开启自动化配置,零配置就能运行,那么它的原理是什么?要理解这个,必须首先理解什么是条件注解。抛开 Spring Boot,我们来单纯的看看在 Spring 中条件注解的用法。首先我们来创建一个普通的 Maven 项目,然后引入 spring-context,如下
1)创建一个接口 Food
package com.java; public interface Food { String showName(); }
2)创建 impl包,创建Food接口的两个实现类Rice和 Noodles
package com.java.impl; import com.java.Food; public class Rice implements Food { @Override public String showName() { return "米饭"; } }
package com.java.impl; import com.java.Food; public class Noodles implements Food { @Override public String showName() { return "面条"; } }
3)创建condition包,接下来再分别创建 Rice 和 Noodles 的条件类NoodlesCondition
和 RiceCondition
package com.java.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; public class RiceCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { return conditionContext.getEnvironment().getProperty("people").equals("南方人"); } }
package com.java.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; public class NoodlesCondition implements Condition { @Override public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { return conditionContext.getEnvironment().getProperty("people").equals("北方人"); } }
在 matches 方法中做条件属性判断,当系统属性中的 people 属性值为 ‘北方人‘ 的时候,NoodlesCondition 的条件得到满足,当系统中 people 属性值为 ‘南方人‘ 的时候,RiceCondition 的条件得到满足,换句话说,哪个条件得到满足,一会就会创建哪个 Bean 。
3)创建 config包,创建1个配置类JavaConfig
package com.java.config; import com.java.Food; import com.java.condition.NoodlesCondition; import com.java.condition.RiceCondition; import com.java.impl.Noodles; import com.java.impl.Rice; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @Configuration public class JavaConfig { @Bean("food") @Conditional(RiceCondition.class) Food rice(){ return new Rice(); } @Bean("food") @Conditional(NoodlesCondition.class) Food noodles(){ return new Noodles(); } }
这个配置类,大家重点注意两个地方:
l 两个 Bean 的名字都为 food,这不是巧合,而是有意取的。两个 Bean 的返回值都为其父类对象 Food。
l 每个 Bean 上都多了 @Conditional 注解,当 @Conditional 注解中配置的条件类的 matches 方法返回值为 true 时,对应的 Bean 就会生效。
l Configuration:是定义配置类的注解,该类类似Spring中的ApplicationContext.xml文件。
l @Bean相当于配置文件中的<bean>节点中声明bean对象。
4)编写测试类
package com.java; import com.java.config.JavaConfig; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext(); ctx.getEnvironment().getSystemProperties().put("people","南方人"); ctx.register(JavaConfig.class); ctx.refresh(); Food food= (Food) ctx.getBean("food"); System.out.println(food.showName()); } }
首先我们创建一个 AnnotationConfigApplicationContext 实例用来加载 Java 配置类,然后我们添加一个 property 到 environment 中,添加完成后,再去注册我们的配置类,然后刷新容器。容器刷新完成后,我们就可以从容器中去获取 food 的实例了,这个实例会根据 people 属性的不同,而创建出来不同的 Food 实例。这个就是 Spring 中的条件注解。
大家可以动手写一下,无需半个小时。峰哥会按照一定的节奏,在公众号发布,同时大家也可以关注我在博客园中的专栏 https://www.cnblogs.com/027kgc/.对于文章中的内容,峰哥会陆续开始免费的公开课。
以上是关于峰哥说技术: 05-Spring Boot条件注解注解的主要内容,如果未能解决你的问题,请参考以下文章
峰哥说技术:09-Spring Boot整合JSP视图
峰哥说技术:08-Spring Boot整合FreeMarker视图
峰哥说技术系列-9 Spring Boot ControllerAdvice处理全局异常 - 副本
Spring Boot 条件注解
Spring Boot 条件注解
spring boot: 条件注解@Condition