静态方法引用spring对象&原理

127 阅读1分钟

一些工具类可能需要依赖spring注解,为了方便可以把工具方法做成静态方法。我常用的工具有分布式锁、环境判断、日志跨系统传输,好多系统的Env工具

实现

方式一:通过@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初始化阶段去反射调用带有该注解的方法;方式二也类似。