一些工具類可能需要依賴spring註解,爲了方便可以把工具方法做成靜態方法。我常用的工具有分佈式鎖、環境判斷、日誌跨系統傳輸...
實現
方式一:通過@PostConstruct註解實現
@Component
public class RuleLogUtils {
@Resource
private RuleMetaqProvider ruleMetaqProvider;
@Resource
private RulePropertiesConfig rulePropertiesConfig;
public static RuleLogUtils ruleLogUtils;
@PostConstruct
public void init() {
ruleLogUtils = this;
ruleLogUtils.ruleMetaqProvider = this.ruleMetaqProvider;
ruleLogUtils.rulePropertiesConfig = this.rulePropertiesConfig;
}
...
...
ruleLogUtils.ruleMetaqProvider.sendMsg(RuleTopicEnum.RULE_LOG_TOPIC, JSON.toJSONString(ruleLogDTO));
方式二:通過實現bean初始化接口實現
覆蓋bean的初始化後的方法,將代理對象傳遞到工具類。
實現BeanPostProcessor接口、聲明@Bean註解的init方法、實現InitializingBean接口 等等,能在bean初始化後運行的都可以。
原理
在靜態方法中想要調用spring對象,主要解決的問題就是能夠在spring對象加載完成後,再將spring的動態代理對象賦值給靜態對象(注意這裏一定要是spring的代理對象),就可以實現了。
@PostConstruct
雖然說是jdk內部註解,spring對該註解也進行了支持和擴展,會在bean初始化階段去反射調用帶有該註解的方法;方式二也類似。