Spring/SpringBoot装配注入带参数的静态工具方法(例阿里云短信发送示例)

2022-02-16 747点热度 0人点赞 0条评论

平时开发时候有一些静态的工具方法,调用的时候比较方便,但是有时候,一些工具方法需要传入一些配置文件里面的参数(如果是用springboot那就调用application.yml里的参数)

我们可以这样改造

  • 工具方法加@Component注解;
  • 需要引入的配置参数,用@Value注解引入;
  • 一些初始化的配置,使用@PostConstruct注解进行初始化;

以阿里云的短信发送为例,示例代码如下(我把初始化com.aliyun.dysmsapi20170525.Client作为static静态变量,放在PostConstruct里初始化,这样后续调用就不会一直生成新的实例,可以复用):

import com.aliyun.dysmsapi20170525.Client;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.tea.TeaModel;
import com.aliyun.teaopenapi.models.Config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @author Terry E-mail: yaoxinghuo at 126 dot com
 * @date 2022-2-18 14:20
 * @description
 */
@Component
public class DysmsUtil {
    private static final Log log = LogFactory.getLog(DysmsUtil.class);

    private static Client client;
    private static String getSignName;

    @Value(value = "${my.dysms.accessKeyId}")
    private String accessKeyId;

    @Value(value = "${my.dysms.accessKeySecret}")
    private String accessKeySecret;

    @Value(value = "${my.dysms.signName}")
    private String signName;

    @PostConstruct
    public void init() throws Exception {
        Config config = new Config()
                .setAccessKeyId(accessKeyId)
                .setAccessKeySecret(accessKeySecret);
        config.endpoint = "dysmsapi.aliyuncs.com";
        client = new com.aliyun.dysmsapi20170525.Client(config);
        getSignName = signName;
//        log.error("init called, accessKeyId: " + accessKeyId + ", signName: " + signName);
    }

    /**
     * 单条手机发送信息 static方法调用 ,template例如:"{\"code\":\"" + verificationCode + "\"}"
     */
    public static void sendSms(String mobile, String templateCode, String template) {
        SendSmsRequest sendSmsRequest = new SendSmsRequest()
                .setPhoneNumbers(mobile)
                .setSignName(getSignName)  //短信签名名称
                .setTemplateCode(templateCode) //短信模板ID
                .setTemplateParam(template); //变量值
        try {
            SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);
//            SendSmsResponseBody sendBody = sendSmsResponse.getBody();

            log.info("==================================================================================================>>");
//            log.info("sendSmsRequest:" + com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(sendSmsRequest)));
            log.info("SendSmsResponse:" + com.aliyun.teautil.Common.toJSONString(TeaModel.buildMap(sendSmsResponse)));
            log.info("==================================================================================================>>");
        } catch (Exception e) {
            log.error("error send sms to: " + mobile + ", template code: " + templateCode + ", template: " + template, e);
        }
    }


}

调用就比较简单,直接DysmsUtil.sendSms就可以了。

@PostConstruct注解作用:是Java EE 5引入的注解,Spring允许开发者在受管Bean中使用它。当DI容器实例化当前受管Bean时,@PostConstruct注解的方法会被自动触发,从而完成一些初始化工作。
注意:

只有一个方法可以使用此注释进行注解;
被注解方法不得有任何参数;
被注解方法返回值为void;
被注解方法不得抛出已检查异常;
被注解方法需是非静态方法;
此方法只会被执行一次。

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论