日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postconstruct_@PostConstruct注解,你该好好看看

發布時間:2023/12/13 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 postconstruct_@PostConstruct注解,你该好好看看 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在最近的工作中,get到一個很實用的注解,分享給諸位。

痛點

做過微信或支付寶支付的童鞋,可能遇到過這種問題,就是填寫支付結果回調,就是在支付成功之后,支付寶要根據我們給的地址給我們進行通知,通知我們用戶是否支付成功,如果成功我們就要去處理下面相應的業務邏輯,如果在測試服務,那么這個回調地址我們就需要填寫測試服務的,如果發布到線上那么我們就需要改成線上的地址。

針對上面的場景,我們一般都會通過如下的方式,進行一個動態配置,不需要每次去改,防止出現問題。

public class PayTest {

@Value("${spring.profiles.active}")
private String environment;

public Object notify(HttpServletRequest request) {

if ("prod".equals(environment)) {
// 正式環境
} else if ("test".equals(environment)) {

// 測試環境
}
return "SUCCESS";
}
}

上面的代碼看起來沒有一點問題,但是身為搬磚的我們咋可能這樣搬,姿勢不對呀!

問題:

擴展性太差,如果這個參數我們還需要在別的地方用到,那么我們是不是還要使用@Value的注解獲取一遍,假如有天我們的leader突然說嗎,test這個單詞看著太low了,換個高端一點的,換成dev,那么我們是不是要把項目中所有的test都要改過來,如果少還好,要是很多,那我們怕不是涼了。

所以我們能不能將這些配置參數搞成一個全局的靜態變量,這樣的話我們直接引用就好了,哪怕到時候真的要改,那我也只需要改動一處就好了。

注意大坑

有的朋友可能就比較自信了,那我直接加個static修飾下不就好了,如果你真是打算這樣做,那你就準備卷好鋪蓋走人吧。直接加static獲取到的值其實是一個null,至于原因,大家復習下類以及靜態變量變量的加載順序。

@PostConstruct注解

那么既然說出了問題,肯定就有解決方法,不然你以為我跟你玩呢。

首先這個注解是由Java提供的,它用來修飾一個非靜態的void方法。它會在服務器加載Servlet的時候運行,并且只運行一次

改造:

@Component
public class SystemConstant {

public static String surroundings;

@Value("${spring.profiles.active}")
public String environment;

@PostConstruct
public void initialize() {
System.out.println("初始化環境...");
surroundings = this.environment;
}
}

結果:

我們可以看到在項目啟動的時候進行了初始化

到這里我們已經可以拿到當前運行的環境是測試還是正式,這樣就可以做到動態配置

最后想說

其實這個注解遠不止這點用處,像我之前寫的Redis工具類,我使用的是RedisTemplate操作Redis,導致寫出來的方法沒辦法用static修飾,每次使用Redis工具類只能先注入到容器然后再調用,使用了這個注解就可以完美的解決這種尷尬的問題。代碼如下。

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如何根據屬性排序?快來get吧

高效開發,超實用的一款IDEA開發插件

總結

以上是生活随笔為你收集整理的postconstruct_@PostConstruct注解,你该好好看看的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。