postconstruct_@PostConstruct注解,你该好好看看
在最近的工作中,get到一個(gè)很實(shí)用的注解,分享給諸位。
痛點(diǎn)
做過微信或支付寶支付的童鞋,可能遇到過這種問題,就是填寫支付結(jié)果回調(diào),就是在支付成功之后,支付寶要根據(jù)我們給的地址給我們進(jìn)行通知,通知我們用戶是否支付成功,如果成功我們就要去處理下面相應(yīng)的業(yè)務(wù)邏輯,如果在測試服務(wù),那么這個(gè)回調(diào)地址我們就需要填寫測試服務(wù)的,如果發(fā)布到線上那么我們就需要改成線上的地址。
針對上面的場景,我們一般都會通過如下的方式,進(jìn)行一個(gè)動態(tài)配置,不需要每次去改,防止出現(xiàn)問題。
public class PayTest {@Value("${spring.profiles.active}")
private String environment;
public Object notify(HttpServletRequest request) {
if ("prod".equals(environment)) {
// 正式環(huán)境
} else if ("test".equals(environment)) {
// 測試環(huán)境
}
return "SUCCESS";
}
}
上面的代碼看起來沒有一點(diǎn)問題,但是身為搬磚的我們咋可能這樣搬,姿勢不對呀!
問題:
擴(kuò)展性太差,如果這個(gè)參數(shù)我們還需要在別的地方用到,那么我們是不是還要使用@Value的注解獲取一遍,假如有天我們的leader突然說嗎,test這個(gè)單詞看著太low了,換個(gè)高端一點(diǎn)的,換成dev,那么我們是不是要把項(xiàng)目中所有的test都要改過來,如果少還好,要是很多,那我們怕不是涼了。
所以我們能不能將這些配置參數(shù)搞成一個(gè)全局的靜態(tài)變量,這樣的話我們直接引用就好了,哪怕到時(shí)候真的要改,那我也只需要改動一處就好了。
注意大坑
有的朋友可能就比較自信了,那我直接加個(gè)static修飾下不就好了,如果你真是打算這樣做,那你就準(zhǔn)備卷好鋪蓋走人吧。直接加static獲取到的值其實(shí)是一個(gè)null,至于原因,大家復(fù)習(xí)下類以及靜態(tài)變量變量的加載順序。
@PostConstruct注解
那么既然說出了問題,肯定就有解決方法,不然你以為我跟你玩呢。
首先這個(gè)注解是由Java提供的,它用來修飾一個(gè)非靜態(tài)的void方法。它會在服務(wù)器加載Servlet的時(shí)候運(yùn)行,并且只運(yùn)行一次。
改造:
@Componentpublic class SystemConstant {
public static String surroundings;
@Value("${spring.profiles.active}")
public String environment;
@PostConstruct
public void initialize() {
System.out.println("初始化環(huán)境...");
surroundings = this.environment;
}
}
結(jié)果:
我們可以看到在項(xiàng)目啟動的時(shí)候進(jìn)行了初始化
到這里我們已經(jīng)可以拿到當(dāng)前運(yùn)行的環(huán)境是測試還是正式,這樣就可以做到動態(tài)配置
最后想說
其實(shí)這個(gè)注解遠(yuǎn)不止這點(diǎn)用處,像我之前寫的Redis工具類,我使用的是RedisTemplate操作Redis,導(dǎo)致寫出來的方法沒辦法用static修飾,每次使用Redis工具類只能先注入到容器然后再調(diào)用,使用了這個(gè)注解就可以完美的解決這種尷尬的問題。代碼如下。
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @ClassName RedisUtil
* @Description TODO
* @Auther bingfeng
* @Date 2019/7/4/004 17:14
* @Version 1.0
*/
@Component
public class RedisUtil {
private static RedisTemplate redisTemplates;
@Autowired
private RedisTemplate redisTemplate;
@PostConstruct
public void initialize() {
redisTemplates = this.redisTemplate;
}
/**
* 添加元素
*
* @param key
* @param value
*/
public static void set(Object key, Object value) {
if (key == null || value == null) {
return;
}
redisTemplates.opsForValue().set(key, value);
}
}【推薦閱讀】
字符串、集合如何判斷空值?看看成年人的正確操作
List如何根據(jù)屬性排序?快來get吧
高效開發(fā),超實(shí)用的一款I(lǐng)DEA開發(fā)插件總結(jié)
以上是生活随笔為你收集整理的postconstruct_@PostConstruct注解,你该好好看看的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CefSharp应用——程序输出
- 下一篇: vb.net 设置打印纸张与页边距_装订