一些工具类可能需要依赖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初始化阶段去反射调用带有该注解的方法;方式二也类似。