平时开发时候有一些静态的工具方法,调用的时候比较方便,但是有时候,一些工具方法需要传入一些配置文件里面的参数(如果是用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;
被注解方法不得抛出已检查异常;
被注解方法需是非静态方法;
此方法只会被执行一次。
文章评论