最近在優(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配置文件的獲取方式可能會有所不同,要注意