關于一次@value獲取不到值的問題

最近在優(yōu)化項目,發(fā)現(xiàn)項目中使用的hikaridatasource連接池,原先的SQL打印使用的是自定義的攔截器,打印的還有問題,所以打算使用p6spy來記錄SQL,使用時想針對慢SQL進行釘釘提醒,所以自定義了p6spy記錄消息,代碼如下:

@Component
public class P6SpyLogger implements MessageFormattingStrategy {
    @Value("${spring.profiles.active}")
    private String profile;
    @Override
    public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql, String url) {
        String content = !"".equals(sql.trim()) ? "[ " + LocalDateTime.now() + " ] --- | SQL耗時 "
                + elapsed + "ms | 連接信息: " + category + connectionId + "\n "
                + sql + ";" : "";
        if (elapsed >= 2000) {
            DingDingMsgSendUtils.sendDingDingGroupMsg("【重要消息】" + profile + "環(huán)境,發(fā)現(xiàn)慢SQL,請檢查:" + content);
        }
        if (!profile.equals("dev")) {
            return "";
        }
        return content;
    }
}

然而獲取到的profile一直未null,獲取不到,網(wǎng)上查找了好多,發(fā)現(xiàn)
@Value,兩者必須使用在bean的實例中,例如被@Controller,@Service,@Component等注解的類里邊。
咦。。。那我沒問題啊,是用被@Component注解的類啊,百思不得其解,翻閱多篇博客,終于找到了原因。原來,使用@Value的類,在spring中,不能直接通過new 操作符來使用,而是應該通過spring的注解 @Autowired 來使用(這個操作相信大家都會,就不演示了)。然后我看了p6spy的源代碼,發(fā)現(xiàn)確實是通過new操作來使用的P6SpyLogger。這時我們應該怎么獲取呢?

第一種方法

@Component
@Data
public class BootstrapInfo {
    @Value("${spring.profiles.active}")
    private String active;
    private static String profile;
    @PostConstruct
    public void setProfile() {
        profile = this.active;
    }
    public static String getProfile() {
        return profile;
    }
}

首選要在BootstrapInfo里建一個static的變量,然后使用@Value獲取yml配置文件的值。最后關鍵就是使用 @PostConstruct 熟悉將yml中配置的值賦給本地的變量,這樣后面的靜態(tài)方法就能使用了。

注意事項:
注意BootstrapInfo類使用了 @Component 屬性注解了說明是需要在啟動類 Application 啟動的時候加載的,所以我們本地寫一個方法調(diào)用 BootstrapInfo 的時候是獲取不到 profile的。

第二種方法

通過YamlPropertiesFactoryBean這種方式去獲取yml中的值
代碼如下:

    public static Object getBootstrapYml(Object key){
        Resource resource = new ClassPathResource("bootstrap.yml");
        Properties properties = null;
        try {
            YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();
            yamlFactory.setResources(resource);
            properties =  yamlFactory.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return properties.get(key);
    }
 
    public static void main(String[] args) {
        System.out.println(getBootstrapYml("spring.profiles.active"));
    } 

注意:
yml和properties配置文件的獲取方式可能會有所不同,要注意

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容