一些工具類可能需要依賴spring注解,為了方便可以把工具方法做成靜態(tài)方法。我常用的工具有分布式鎖、環(huán)境判斷、日志跨系統(tǒng)傳輸...
實(shí)現(xiàn)
方式一:通過@PostConstruct注解實(shí)現(xiàn)
@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));
方式二:通過實(shí)現(xiàn)bean初始化接口實(shí)現(xiàn)
覆蓋bean的初始化后的方法,將代理對(duì)象傳遞到工具類。
實(shí)現(xiàn)BeanPostProcessor接口、聲明@Bean注解的init方法、實(shí)現(xiàn)InitializingBean接口 等等,能在bean初始化后運(yùn)行的都可以。
原理
在靜態(tài)方法中想要調(diào)用spring對(duì)象,主要解決的問題就是能夠在spring對(duì)象加載完成后,再將spring的動(dòng)態(tài)代理對(duì)象賦值給靜態(tài)對(duì)象(注意這里一定要是spring的代理對(duì)象),就可以實(shí)現(xiàn)了。
@PostConstruct
雖然說是jdk內(nèi)部注解,spring對(duì)該注解也進(jìn)行了支持和擴(kuò)展,會(huì)在bean初始化階段去反射調(diào)用帶有該注解的方法;方式二也類似。