使用@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

因为AiService 只有一个实现类Bean是加入IOC的,所以 使用@Autowired按类型注入就行了。若有多个实现类Bean。那么使用@Resource 并填上BeanName参数来选择注入具体某个Bean。

    @Autowired
    private AiService aiService;

配置business.idCartOcr.choice=GDCA 时就只会自动实例化GdcaUtilsServiceImpl,反之配置business.idCartOcr.choice=BAIDU时就只实例化BaiduUtilsServiceImpl。

@ConditionalOnExpression使用多个配置属性值

&&的关系

还可以使用+连接

equals的关系

@ConditionalOnExpression("'${com.property1}'.equals('${com.property2}')")

////////////////////////////////////////////////////////////////////////////

 



posted @ 2022-09-01 09:56  multitude  阅读(1374)  评论(0编辑  收藏  举报