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