靜態方法引用spring對象&原理

一些工具類可能需要依賴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初始化階段去反射調用帶有該註解的方法;方式二也類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章