zoukankan      html  css  js  c++  java
  • 静态方法中注入bean

    @Component
    public class ScriptExecuteContent {

    @Autowired
    private static SignRepository signRepository;
    
    public static String checkSign(String certNo, String acctNo, String instCode) {
        Sign sign = signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode);
        if (null != sign
                && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code())
                && DateUtil.getCurrentDate().before(sign.getExpireTime())) {
            return "1";
        } else {
            return "0";
        }
    }

    }


    该段代码晃眼一看没啥问题,但是运行就会null异常,因为此处注入的signRepository为null,这是因为静态方法是属于类的,普通方法才属于对象,spring注入是在容器中实例化变量的,并且静态是优先于对象存在的,所以直接在静态方法中调用注入的静态变量其实是为null的,针对这点不太明白的,可以自行补一下java基础。
    但是现实当中我们很多情况需要再静态方法中调用注入的bean对象,要怎么样实现呢?我目前知道的有两种方法。

    解决问题:
    1. @Autowired 用在构造函数上
    我们知道@Autowired 注释,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,此种方式就是在构造函数上使用@Autowired。
    代码参考:


    @Component
    public class ScriptExecuteContent {

    private static SignRepository signRepository;
    
    @Autowired
    public ScriptExecuteContent(SignRepository signRepository) {
        ScriptExecuteContent.signRepository = signRepository;
    }
    
    public static String checkSign(String certNo, String acctNo, String instCode) {
        Sign sign = signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode);
        if (null != sign
                && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code())
                && DateUtil.getCurrentDate().before(sign.getExpireTime())) {
            return "1";
        } else {
            return "0";
        }
    }

    }


    2. 使用 @PostConstruct 注解
    @PostConstruct是Java EE 5引入来影响Servlet生命周期的注解,被用来修饰非静态的void()方法,@PostConstruct在构造函数之后执行,init()方法之前执行。
    代码参考:


    @Component
    public class ScriptExecuteContent {

    @Autowired
    private SignRepository signRepository;
    
    private static ScriptExecuteContent scriptExecuteContent;
    
    @PostConstruct
    public void init() {
        scriptExecuteContent = this;
        scriptExecuteContent.signRepository = this.signRepository;
    }
    
    public static String checkSign(String certNo, String acctNo, String instCode) {
        Sign sign = scriptExecuteContent.signRepository.findByCertNoAndAcctNoAndInstCode(certNo, acctNo, instCode);
        if (null != sign
                && StringUtils.equals(sign.getStatus(), StatusEnum.SUCCESS.code())
                && DateUtil.getCurrentDate().before(sign.getExpireTime())) {
            return "1";
        } else {
            return "0";
        }
    }

    }


    总结:以上两种方式都能实现静态方法中直接使用注入的bean对象,实现方式肯定不止这两种,自己基础差了,目前只知道这两种。

  • 相关阅读:
    04、Unity_声音管理器
    StreamingAssets文件夹的读取异常
    Unity做360度的全景照片
    07.C#中如何排除/过滤/清空/删除掉字符串数组中的空字符串
    03、三种简单的计时器
    02、在层级未知情况下通过递归查找子物体
    Java中请优先使用try-with-resources而非try-finally
    Redis——入门学习笔记
    KafKa——学习笔记
    SpringBoot——学习笔记
  • 原文地址:https://www.cnblogs.com/talkingcat/p/13203844.html
Copyright © 2011-2022 走看看