峰哥说java_峰哥说技术: 05-Spring Boot条件注解注解

Spring Boot深度课程系列

峰哥说技术—2020庚子年重磅推出、战胜病毒、我们在行动

05 峰哥说技术  Spring Boot条件注解

@EnableAutoConfiguration开启自动化配置,零配置就能运行,那么它的原理是什么?要理解这个,必须首先理解什么是条件注解。抛开 Spring Boot,我们来单纯的看看在 Spring 中条件注解的用法。首先我们来创建一个普通的 Maven 项目,然后引入 spring-context,如下

59eee694b468d51841a0de40ee75237e.png

43f9770bfd0f5d75dca225d6f8011ebf.png

d6d0c86e14f899aa4c293e7087ebc6d1.png

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对象。

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

峰哥说技术:10-Spring Boot静态资源处理

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 10  峰哥说技术:Spring Boot静态资源处理 今天我们聊聊关于 Spring Boot 中关于静 ...

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

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 09  峰哥说技术:Spring Boot整合JSP视图 一般来说我们很少推荐大家在Spring boot ...

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

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 08  峰哥说技术:Spring Boot整合FreeMarker视图 前面带着大家整合了Thymelea ...

峰哥说技术:04-Spring Boot基本配置

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 04 Spring Boot基本配置 1)容器的相关配置 在Spring Boot中可以内置Tomcat. ...

峰哥说技术:03-Spring Boot常用注解解读

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 03 Spring Boot常用注解解读 在Spring Boot中使用了大量的注解,我们下面对一些常用的 ...

峰哥说技术:01-Spring Boot介绍

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 Spring Boot介绍 A.Spring Boot是什么? 由于Spring是一个轻量级的企业开发框架 ...

峰哥说技术:06-手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 06  峰哥说技术:手撸Spring Boot自定义启动器,解密Spring Boot自动化配置原理 Sp ...

峰哥说技术:02-第一个Spring Boot应用程序

Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 02第一个Spring Boot应用程序 1.版本要求 集成开发环境:IntelliJ IDEA 2017 ...

黑马_13 Spring Boot:05.spring boot 整合其他技术

13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 05.spring boot 整合其他 ...

随机推荐

GoF23种设计模式

创建型模式 1.ABSTRACT FACTORY-追MM少不了请吃饭了,麦当劳的套餐和肯德基的套餐都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说"两个B ...

Java中各种(类、方法、属性)访问修饰符与修饰符的说明

类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...

Java 使用 Stream API 筛选 List

前言 上课的时候看到老师用迭代器来遍历 List 中的元素的时候,我的内心是极其嫌弃的,这种迭代方法不能直接访问当前的元素,而且写起来也麻烦.于是上网查了查 Java 有没有类似于 Linq 的东西, ...

poj 3261 Milk Patterns(后缀数组)(k次的最长重复子串)

Milk Patterns Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7938   Accepted: 3598 Cas ...

解压版tomcat设置为系统服务

1.先关闭tomcat,在"开始 "→"运行 "中输入cmd 命令,进入MS-DOS界面 2.进入 到tomcat的bin目录下 (解压版tomcat存放目录, ...

[转]PostgreSQL 中文资料汇总

原文链接:http://francs3.blog.163.com/blog/static/405767272014017341219/ --1 中文社区网站  PostgreSQL 中文社区官网: h ...

lesson - 8 课程笔记 tar / gzip /bzip2 / xz /

作用:为linux的文件和目录创建档案,也可以在档案中改变文件,或者向档案中加入新的文件即用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的  语法:tar[必要参数][选择参数][ ...

Linux内存描述之内存节点node--Linux内存管理(二)

1 内存节点node 1.1 为什么要用node来描述内存 这点前面是说的很明白了, NUMA结构下, 每个处理器CPU与一个本地内存直接相连, 而不同处理器之前则通过总线进行进一步的连接, 因此相对 ...

【原创】大叔经验分享(5)oozie提交spark任务如何添加依赖

spark任务添加依赖的方式: 1 如果是local方式运行,可以通过--jars来添加依赖: 2 如果是yarn方式运行,可以通过spark.yarn.jars来添加依赖: 这两种方式在oozie上 ...

关于Python的协程问题总结

协程其实就是可以由程序自主控制的线程 在python里主要由yield 和yield from 控制,可以通过生成者消费者例子来理解协程 利用yield from 向生成器(协程)传送数据# 传统的生 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值