峰哥说技术: 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/.对于文章中的内容,峰哥会陆续开始免费的公开课。

原文地址:https://www.cnblogs.com/027kgc/p/12393798.html

时间: 2024-07-31 23:20:07

峰哥说技术: 05-Spring Boot条件注解注解的相关文章

峰哥说技术:08-Spring Boot整合FreeMarker视图

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 08  峰哥说技术:Spring Boot整合FreeMarker视图 前面带着大家整合了Thymeleaf视图,今天我们继续聊聊关于视图整合的话题.FreeMarker这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页.电子邮件.配置文件以及源代码等.Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通

峰哥说技术:09-Spring Boot整合JSP视图

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 09  峰哥说技术:Spring Boot整合JSP视图 一般来说我们很少推荐大家在Spring boot中使用jsp作为模板,但是很多的同学可能会想了解,所以峰哥这里也给大家做一个简单的介绍,它不复杂.只是需要我们添加手动添加2个依赖,同时要编写Java配置类,自定义视图解析器.对于jsp的视图需要我们放到webapps下面,需要手工补全.给大家讲解一下. 1)创建一个Spring boot工程.手动

Spring+Spring Boot+Mybatis框架注解解析

Restful 风格下的Spring Boot的注解开发 电商网站经常用到的restful风格 ,只是一种开发思想,不是开发框架,现在的技术并没有完全实现restful风格. restful风格是一种架构理念,完美的诠释了http协议 restful 方式需要配置一套restful风格的前端控制器,用/来标识url-pattern RequestMapping(value="/ViewItems/{id}" String id) java类里面使用@PathVariable("

【spring boot+mybatis】注解使用方式(无xml配置)设置自动驼峰明明转换(),IDEA中xxDao报错could not autowire的解决方法

最近使用spring boot+mybatis,使用IntelliJ IDEA开发,记录一些问题的解决方法. 1.在使用@Mapper注解方式代替XXmapper.xml配置文件,使用@Select等注解配置sql语句的情况下,如何配置数据库字段名到JavaBean实体类属性命的自动驼峰命名转换? 使用spring boot后,越来越喜欢用注解方式进行配置,代替xml配置文件方式.mybatis中也可以完全使用注解,避免使用xml方式配置mapper.(参考  springboot(六):如何优

Spring Boot中的注解

文章来源:http://www.tuicool.com/articles/bQnMra 在Spring Boot中几乎可以完全弃用xml配置文件,本文的主题是分析常用的注解. Spring最开始是为了解决EJB等大型企业框架对应用程序的侵入性,因此大量依靠配置文件来“非侵入式”得给POJO增加功能,然而,从Spring 3.x开始,Spring被外界最为诟病的一点就是配置繁多,号称“配置地狱”,各种xml文件,出了问题非常难排查.从Spring 4.x开始,Spring.io提供了三种方式编织B

详解spring boot mybatis全注解化

本文重点介绍spring boot mybatis 注解化的实例代码 1.pom.xml //引入mybatis <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> //

spring boot 自定义Validator注解

spring boot在Post接受一个对象参数的时候可以使用@Valid去验证,如下代码 在创建一个User类 上面的@NotBlank和@Past就做了一个判断,如何做类似的注解用来验证数据 创建一个MyConstraint的接口 @Retention :用来说明该注解类的生命周期.它有以下三个参数:RetentionPolicy.SOURCE : 注解只保留在源文件中RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃RetentionPo

spring boot 条件注解表达式

@Configuration @ConditionalOnClass(JAXRSServerFactoryBean.class) @ConditionalOnExpression("'${cxf.jaxrs.component-scan}'=='true' && '${cxf.jaxrs.classes-scan}'!='true'") @Import(SpringComponentScanServer.class) protected static class Jax

spring boot: 条件注解@Condition

@Conditional根据满足某一个特定的条件创建一个特定的Bean(基于条件的Bean的创建,即使用@Conditional注解). 比方说,当一个jar包在一个类的路径下的时候,自动配置一个或多个Bean,或者只有某个Bean被创建才会去创建另外一个Bean. 通过实现Condition接口,并重写期matches方法来构造判断条件.若在windows系统洗运行程序,则输出列表命令dir,若在linux操作系统下运行程序,则输出命令为:ls. 1.判断条件定义 判断windows的条件 1