Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。
本章大纲:
(2)编码思路
(3)编写条件类WindowCondition和LinuxCondition
(4)编写接口CmdService以及两个实现类
(5)编写配置类,根据条件进行注入不同的类
(6)编写测试代码
(7)Spring提供的Condition
(8)题外话:怎么在Condition中获取application.properties的配置项
接下里看下具体的内容:
(1)例子说明
在java中这种情况,调用系统的cmd命令,但是我们知道在window和linux下命令有些有些时候是不一样的,那么我们以前一般是这么处理;
//伪代码: if(window){ //具体的处理代码 }else if(Linux){ //具体的处理代码. }
当具体的处理代码很多的时候,我们会放到另外一个处理类来进行处理,比如:WindowService和LinuxService。你有没有发现这里如果我们使用了@Service进行注解WindowServie和LinuxService的话,那么内存中就会存在两个Service,而实际上有一个service根本一次都不会执行到。好了,针对于这个问题@Conditional就可以解决。当然它还有其它强大的地方。
(2)编码思路
(a)首先这里的话,有一个条件表达式的编写,满足什么条件下返回true,这个是接口Condition,我们需要去实现它;
(b)当满足条件的时候,进行做什么事情,这里使用的是@Conditional,当@Conditional(条件类.class)中的条件类返回true的时候,@Conditional所注解的类或者方法就会执行。
(3)编写条件类WindowCondition和LinuxCondition
WindowCondition:
package com.kfit.demo.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; /** * window操作系统的条件:当在Window系统下运行的时候,matches方法会返回true,否则返回false. * @author Angel --守护天使 * @version v.0.1 * @date 2017年8月23日 */ public class WindowCondition implements Condition{ /** * 这里写自己的逻辑,只有返回true,才会启用配置 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").contains("Windows"); } }
window操作系统的条件: 当在Window系统下运行的时候,matches方法会返回true,否则返回false.
LinuxCondition:
package com.kfit.demo.condition; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; /** * Linux操作系统的条件:当在Linux系统下运行的时候,matches方法会返回true,否则返回false. * @author Angel --守护天使 * @version v.0.1 * @date 2017年8月23日 */ public class LinuxCondition implements Condition{ /** * 这里写自己的逻辑,只有返回true,才会启用配置 */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { return context.getEnvironment().getProperty("os.name").contains("Linux"); } }
Linux操作系统的条件: 当在Linux系统下运行的时候,matches方法会返回true,否则返回false.
(4)编写接口CmdService以及两个实现类
CmdService
package com.kfit.demo; public interface CmdService { public void print(); }
接口类,具体实现代码有两个service,WindowCmdService和LinuxCmdService。
WindowCmdService:
package com.kfit.demo.service; import com.kfit.demo.CmdService; public class WindowCmdService implements CmdService{ @Override public void print() { System.out.println("Window cmd..."); } }
LinuxCmdService:
package com.kfit.demo.service; import com.kfit.demo.CmdService; public class LinuxCmdService implements CmdService{ @Override public void print() { System.out.println("Linux cmd..."); } }
注意:以上的两个实现类WindowCmdService和LinuxCmdService这里我们并没有使用@Service注解进行注入,下面我们使用配置类根据不同的系统注入不同的类。
(5)编写配置类,根据条件进行注入不同的类
CmdServiceConditionConfig:
package com.kfit.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import com.kfit.demo.CmdService; import com.kfit.demo.condition.LinuxCondition; import com.kfit.demo.condition.WindowCondition; import com.kfit.demo.service.LinuxCmdService; import com.kfit.demo.service.WindowCmdService; /** * 条件配置类. * @author Angel --守护天使 * @version v.0.1 * @date 2017年8月23日 */ @Configuration public class CmdServiceConditionConfig { /** * 当WindowCondition方法中的matches返回true的时候, * WindowCmdService会被注入,否则不注入。 */ @Bean("cmdService") @Conditional(WindowCondition.class) public CmdService windowCmdService(){ return new WindowCmdService(); } /** * 当LinuxCondition方法中的matches返回true的时候, * LinuxCmdService会被注入,否则不注入。 */ @Bean("cmdService") @Conditional(LinuxCondition.class) public CmdService LinuxCmdService(){ return new LinuxCmdService(); } }
这里使用@Conditional根据满足不同的条件注入不同的类,在Linux下会注入实现类LinuxCmdService,在Window下会注入WindowCmdService。
(6)编写测试代码
在启动类的main方法中编写测试代码:
public static void main(String[] args) { ApplicationContext ctx = (ApplicationContext) SpringApplication.run(App.class, args); CmdService cmdService = ctx.getBean(CmdService.class); cmdService.print(); }
在Window下运行控制台打印信息:
在Linux下运行控制台打印信息(亲测):
(7)Spring提供的Condition
除了自己自定义Condition之外,Spring还提供了很多Condition给我们用
(a)@ConditionalOnBean
仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
(b)@ConditionalOnClass
某个class位于类路径上,才会实例化一个Bean
(c)@ConditionalOnExpression
当表达式为true的时候,才会实例化一个Bean。
比如:
@ConditionalOnExpression("true")
@ConditionalOnExpression("${my.controller.enabled:false}")
(d)@ConditionalOnMissingBean
仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean
(e)@ConditionalOnMissingClass
某个class类路径上不存在的时候,才会实例化一个Bean
(f)@ConditionalOnNotWebApplication
不是web应用
(8)题外话:怎么在Condition中获取application.properties的配置项
在实际开发中,我们的条件可能保存在application.properties中,那么怎么在Condition中获取呢,这个很简单,主要通过ConditionContext进行获取,具体代码如下:
String port = context.getEnvironment().getProperty("server.port"); System.out.println(port);
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr
相关推荐
改变自动扫描的包【从零开始学Spring Boot】”涉及到的是Spring Boot框架中的组件扫描机制。在Spring Boot中,自动配置是其核心特性之一,它能够根据项目依赖来自动配置相应的Bean。默认情况下,Spring Boot会扫描...
在2017年的SpringBoot视频教程中,你可能会学到如何从零开始搭建Spring Boot项目,理解自动配置的工作原理,如何使用Spring Data JPA进行数据库操作,以及如何利用Actuator进行应用监控。同时,他还可能分享了最佳...
ta_lib-0.5.1-cp312-cp312-win32.whl
课程设计 在线实时的斗兽棋游戏,时间赶,粗暴的使用jQuery + websoket 实现实时H5对战游戏 + java.zip课程设计
ta_lib-0.5.1-cp310-cp310-win_amd64.whl
基于springboot+vue物流系统源码数据库文档.zip
GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载
知识图谱
333498005787635解决keil下载失败的文件.zip
【微信机器人原理与实现】 微信机器人是通过模拟微信客户端的行为,自动处理消息、发送消息的程序。在Python中实现微信机器人的主要库是WeChatBot,它提供了丰富的接口,允许开发者方便地进行微信消息的接收与发送。这个项目标题中的"基于python实现的微信机器人源码"指的是使用Python编程语言编写的微信机器人程序。 1. **Python基础**:Python是一种高级编程语言,以其简洁的语法和强大的功能深受开发者喜爱。在实现微信机器人时,你需要熟悉Python的基本语法、数据类型、函数、类以及异常处理等概念。 2. **微信API与WeChatBot库**:微信为开发者提供了微信公共平台和微信开放平台,可以获取到必要的API来实现机器人功能。WeChatBot库是Python中一个用于微信开发的第三方库,它封装了微信的API,简化了消息处理的流程。使用WeChatBot,开发者可以快速搭建起一个微信机器人。 3. **微信OAuth2.0授权**:为了能够接入微信,首先需要通过OAuth2.0协议获取用户的授权。用户授权后,机器人可以获取到微信用户的身份信息,从而进行
基于springboot实验室研究生信息管理系统源码数据库文档.zip
张力控制,色标跟踪,多轴同步,电子凸轮,横切等工艺控制案例。
在Python编程环境中,处理Microsoft Word文档是一项常见的任务。Python提供了几个库来实现这一目标,如`python-docx`,它可以让我们创建、修改和操作.docx文件。本教程将重点介绍如何利用Python进行Word文档的合并、格式转换以及转换为PDF。 1. **合并Word文档(merge4docx)** 合并多个Word文档是一项实用的功能,特别是在处理大量报告或文档集合时。在Python中,可以使用`python-docx`库实现。我们需要导入`docx`模块,然后读取每个文档并将其内容插入到主文档中。以下是一个基本示例: ```python from docx import Document def merge4docx(file_list, output_file): main_doc = Document() for file in file_list: doc = Document(file) for paragraph in doc.paragraphs: main_doc.add_paragraph(paragraph.text) m
基于springboot+Javaweb的二手图书交易系统源码数据库文档.zip
基于springboot餐品美食论坛源码数据库文档.zip
基于springboot亚运会志愿者管理系统源码数据库文档.zip
使用WPF的数据样式绑定,切换对象数据值来完成控件动态切换背景渐变动画效果。 使用动画样式渲染比线程修改性能消耗更低更稳定
基于SpringBoot的企业客源关系管理系统源码数据库文档.zip
基于springboot+vue的桂林旅游网站系统源码数据库文档.zip
基于springboot嗨玩旅游网站源码数据库文档.zip