设为首页 加入收藏

TOP

结合springboot条件注入@ConditionalOnProperty以及@ConfigurationProperties来重构优化代码(一)
2023-07-25 21:23:08 】 浏览:73
Tags:结合 springboot @ConditionalOnProperty 以及 @ConfigurationProperties

@ConditionalOnProperty实现按需注入bean

短信工具类 SmsUtil

zhenghe-common是一个基础包。

SmsUtil坐落在zhenghe-common里。先看看SmsUtil的面目。

package com.emax.zhenghe.common.util;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
 
@Slf4j
@Configuration
public class SmsUtil {
    @Value("${smtp.config.username}")
    private String userName;
 
    @Value("${smtp.config.requestAddress}")
    private String requestAddress;
 
    @Value("${smtp.config.password}")
    private String passWord;
 
    @Value("${smtp.config.oem.username:oem}")
    private String oemUserName;
 
    @Value("${smtp.config.oem.password:oemsdfaaskdlkfk15673%!@4}")
    private String oemPassWord;
 
    /**
     * 发送短信
     * @param phone 手机号
     * @param msg 短信内容
     * @return
     */
    public String sendSMS(String phone, String msg) {
        StringBuilder sbParam = new StringBuilder();
        StringBuilder url = new StringBuilder();
 
        try {
            sbParam.append("?account=").append(userName);
            sbParam.append("&pwd=").append(URLEncoder.encode(passWord, "UTF-8")).append("&mphone=").append(phone).append("&content=")
                    .append(URLEncoder.encode(msg, "UTF-8"));
            url.append(requestAddress)
                    .append(sbParam.toString());
            Integer result = HttpClientUtils.requestByGetMethod(url.toString());
            return result.toString();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("发送短信异常", e);
        }
 
        return "信息发送成功!";
    }
 
    /**
     * 发送短信
     */
    public String sendSMS(String phone, String msg,String userName,String passWord) {
        ...
    }
 
    /**
     * 发送短信
     */
    public String sendOemSMS(String phone, String msg, String smsSign) {
        StringBuilder smsSignBuilder = new StringBuilder();
        smsSignBuilder.append("【")
                .append(smsSign)
                .append("】")
                .append(msg);
        return sendSMS(phone, smsSignBuilder.toString(), oemUserName, oemPassWord);
    }
}

 

这里要说的是上面通过@Value注入的field。

存在的问题是:这要求所有依赖了zhenghe-common并扫描com.emax.zhenghe.common.util包的应用,都必须定义那些短信相关的properties配置。

需要改进的是:这些properties都以smtp.config开头,所以使用spring-beans的@Value显得啰嗦,不如使用spring-boot的@ConfigurationProperties。

 

先看问题-有的应用不涉及到收发短信,可以不用配置短信相关的这些properties。

解决办法就是spring-boot-autoconfigure的@ConditionalOnProperty注解。

@ConditionalOnProperty注解是spring-boot-autoconfigure下“条件注入”的重要成员,根据配置参数,来决定是否需要创建bean。它主要是通过自身的两个属性来控制自动配置是否生效,这两个属性分别是name、havingValue。只有当配置文件(application.properties或者bootstrap.yml)中和name相同的属性的值和注解上havingValue的值相同时,该配置文件才会生效。

spring-boot-autoconfigure“条件注入”在spring-boot-autoconfigure-XXX.jar包里,package是org.springframework.boot.autoconfigure.condition,“条件注入”常用成员还有ConditionalOnResource、ConditionalOnBean、ConditionalOnClass、ConditionalOnMissingBean、ConditionalOnMissingClass。

敲黑板,@ConditionalOnProperty并不继承@Configuration,它只是控制bean是否生效的,所以@Configuration注解还是需要加在SmsUtil头上的。

如下是@ConditionalOnProperty的javadoc

仔细看javadoc,就能找到答案。这里,我们的改造方案是

@ConditionalOnProperty(prefix = "smtp.config",name = "requestAddress")

下面方式也行,但是不如上面的易读。

@ConditionalOnProperty( name = "smtp.config.requestAddress")

 

@Configuration是spring-context-*

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇配置环境变量 下一篇基本数据类型与引用类型在存储上..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目