• 静态方法中注入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对象,实现方式肯定不止这两种,自己基础差了,目前只知道这两种。

  • 相关阅读:
    sql连接查询中的分类
    HTML之页面镶嵌体验
    JavaScript之搜索框
    (转)Android之常用功能方法大集合
    JAVA之执行cmd命令
    Html之网页分屏浏览
    Javascript之三种按钮点击事件
    用JavaScript做一个小小设计
    JavaBean之简单应用JSP页面
    计算器
  • 原文地址:https://www.cnblogs.com/talkingcat/p/13203844.html
Copyright © 2020-2023  润新知