springboot提供的条件化配置注解@ConditionalOnProperty
问题描述
由于业务原因,公司的login登录包有两个,一个是普通的登录包(简称normal-login),一个是证书登录包(简称abnormal-login,用到https)。代码层面,这两个login包业务代码完全一样,唯一不同的是abnormal-login多了两个配置实例(配置文件方面就不提了,不是重点)。这就导致了,如果normal-login的代码有任何改动(增删接口、代码逻辑修改等)就要同步到abnormal-login包。这样感觉很冗余,而且代码都一样,整个包的代码都在飘黄线,看起来难受。
趁着最近稍微有点时间,就寻思着能不能把这两个包合并了,把证书登陆的两个配置实例做成可配置的。
解决思路
abnormal-login的两个配置实例如下图(这两个类其实就是http->https的处理):
如果abnormal-login的两个配置实例可以做成配置的就可以满足要求(满足某个条件才会去加载),正好最近看到了一个spring的条件化配置的概念,于是就面向百度开发,找到了一个注解@ConditionalOnProperty(该注解是springboot提供的自动化配置中的条件化配置注解,springboot提供了自动化配置,但并不是所有的配置都是一股脑配置,有些配置在满足某些条件下才会生效),作用如下:截图来源
@ConditionalOnProperty需要满足配置文件有特定的值才会加载生效配置类(实例)。该注解具体属性如下图:截图来源
解决方案
一、条件化配置处理
在yml配置文件中新增一个配置,当做证书登陆的开关。
满足加载配置实例的条件:yml配置文件有myConfig.enableAbnormalLogin配置,且值为true。开启证书登录,启动项目后有日志打印:
关闭证书登录配置,没有该日志打印。
二、证书登录开启后的额外问题
虽然两个配置实例做到了可配置,但是突然发现一个新的问题。那就是eureka上的kinfe4j文档(和swagger是一类东西,接口文档)跳转出了问题,eureka上显示的http的端口,但是点击跳转的时候却访问的是https的端口,导致报错。面向百度,查到了这个:eureka常用配置
于是修改yml,接口文档为绝对路径(springboot2.X为ip-address;springboot2以下的版本为ipAddress):
这个端口需要根据是否开启证书登陆而修改,但是原则是获取http端口。如果开启证书登陆,那么该端口需要获取的是myConfig.abnormalPort的端口(myConfig.abnormalPort是http,而server.port变成了https);如果关闭证书登陆,则端口需要获取的是server.port(http)
小结
1、@ConditionalOnProperty可用在配置类或者配置实例上
2、@ConditionalOnProperty是springboot提供的自动化配置特性的条件配置注解
3、spring.cloud.client.ip-address写法是springboot2.X的版本,springboot2以下的写法为spring.cloud.client.ipAddress
萌新发言,不喜勿喷,欢迎大佬指出不当之处!