使用@ConditionalOnExpression注解按yml配置选择实例化Bean,绕不开的SpEL
绕不开的SpEL
////////////////////////////////////////////////////////////////////////////
https://www.jianshu.com/p/d4cb052ebfc2
作者:尹楷楷
链接:https://www.jianshu.com/p/d4cb052ebfc2
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
@ConditionalOnExpression是springboot提供的非常好用的注解。
@ConditionalOnExpression("'true") 当括号中的内容为true时 ,使用该注解的类被实例化。
它可以和@Service、@Component、@Controller、@Repository 、@Bean 、@Configuration 等注解一起使用。可以通过SPEL 表达式
、读取配置文件属性来让IOC容器选择性的扫描加入指定的某个Bean。而不是将所有实现类Bean都加入到IOC,这样会造成一定的资源浪费。简单来说就是按需加载
,而不是全部加载
。
按yml配置来确定是否声明Bean
加到Bean上
@Bean
@ConditionalOnExpression("#{'true'.equals(environment['print.sql.log.enable'])}")
public SqlInterceptor myPlugin() {
return new SqlInterceptor();
}
直接加在@Configuration配置类,这样配置类下所有声明的bean都会受控制
@Configuration
@ConditionalOnExpression("#{'true'.equals(environment['ias.prodxy.enabled'])}")
public class ProxyConfig {
按yml配置选择实例化哪个Bean
比如我在一个serviceImpl类上加上如下注解,那么该类就会根据business.idCartOcr.choice的值是否等于“BAIDU”来决定是否进行创建Bean并加入IOC容器:
@Service("BaiduUtilsServiceImpl")
@ConditionalOnExpression("'${business.idCartOcr.choice}'.equalsIgnoreCase('BAIDU')")
实现1
@Service("BaiduUtilsServiceImpl")
@ConditionalOnExpression("'${business.idCartOcr.choice}'.equalsIgnoreCase('BAIDU')")
public class BaiduUtilsServiceImpl implements AiService {
实现2
("GdcaUtilsServiceImpl")
("'${business.idCartOcr.choice}'.equalsIgnoreCase('GDCA')")
public class GdcaUtilsServiceImpl implements AiService {
public void facePost(String image, String name, String idNo) {
}
public IdCart ocrPost(String photoFront, String photoBack) {
return null;
}
}
因为AiService 只有一个实现类Bean是加入IOC的,所以 使用@Autowired按类型注入就行了。若有多个实现类Bean。那么使用@Resource 并填上BeanName参数来选择注入具体某个Bean。
@Autowired
private AiService aiService;
配置business.idCartOcr.choice=GDCA 时就只会自动实例化GdcaUtilsServiceImpl,反之配置business.idCartOcr.choice=BAIDU时就只实例化BaiduUtilsServiceImpl。
@ConditionalOnExpression使用多个配置属性值
&&的关系
("${properties.first.property.enable:true} && ${properties.second.property.startServer:false}")
还可以使用+连接
("${properties.first.property.enable:true} " +
"&& ${properties.second.property.enable:true} " +
"&& ${properties.third.property.enable:true}")
equals的关系
@ConditionalOnExpression("'${com.property1}'.equals('${com.property2}')")
////////////////////////////////////////////////////////////////////////////
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现