静态方法中注入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对象,实现方式肯定不止这两种,自己基础差了,目前只知道这两种。
静态方法中注入bean的更多相关文章
- Spring IOC容器中注入bean
一.基于schema格式的注入 1.基本的注入方式 (属性注入方式) 根据setXxx()方法进行依赖注入,Spring只会检查是否有setter方法,是否有对应的属性不做要求 <bean id ...
- springboot中velocity tool中注入bean
在使用springboo的时候,遇到一个问题,想在tool类中注入一个bean,一直失败,翻了下源码,是因为工具类的初始化方法为反射class调用newInstance方法,详见 http://www ...
- Spring中注入bean学习的总结
1.在类上直接加注解@Component,那么这个类就直接注入到Spring容器中了 ,像@Contrloller,@Service这些本质上都是@Component, 2.@Configurati ...
- Spring在Thread中注入Bean无效的解决方式
在Spring项目中,有时需要新开线程完成一些复杂任务,而线程中可能需要注入一些服务.而通过Spring注入来管理和使用服务是较为合理的方式.但是若直接在Thread子类中通过注解方式注入Bean是无 ...
- util类中非静态方法中注入serivce,在controller层是使用util。
今天碰到如题的问题,刚一开始在util中注入service总是注入失败,起初我以为是util中没有注入成功,debug看了一下果然注入不进来. 然后各种纠结,最终坑爹的问题是在controller直接 ...
- spring IOC bean中注入bean
俩个实体 package com.java.test4; /** * @author nidegui * @create 2019-06-22 14:45 */ public class People ...
- SSM项目 单元测试中 注入bean 空指针异常
##特别 由于准备春招,所以希望各位看客方便的话,能去github上面帮我Star一下项目https://github.com/Draymonders/Campus-Shop java.lang.Nu ...
- 非spring组件servlet、filter、interceptor中注入spring bean
问题:在filter和interceptor中经常需要调用Spring的bean,filter也是配置在web.xml中的,请问一下这样调用的话,filter中调用Spring的某个bean,这个be ...
- SpringBoot拦截器中无法注入bean的解决方法
SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...
随机推荐
- [Computer Vision]Harris角点检测的详细推导
Harris角点检测 思想 为什么要检测角点呢?因为角点的特征比较明显.进行角点检测的朴素思想是利用图像梯度,也就是根据图像强度的变化来寻找角点.如图所示 这里举了个例子,给定一个小的区域(Patch ...
- 【MySQL】究竟什么是MVCC呢?
MVCC是什么呢? MVCC其实就是一个多版本并发控制,即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据, 在读数据时选择不同版本的数据即可以实现对事务结果的完整性读 ...
- 从大厂DevOps工具链部署,看现代产品的生命周期管理
目录 1. 认识DevOps 1.1. DevOps工具链 1.2. CI 持续集成(Continuous Integration) 1.3. CD(持续交付 & 持续部署) 1.4. Agi ...
- 非线性规划的Matlab 解法
编写M 文件fun1.m 定义目标函数 function f=fun1(x); % 定义目标函数 f=sum(x.^)+; % .^2是矩阵中的每个元素都求平方.^2是求矩阵的平方或两个相同的矩阵相乘 ...
- 深入理解React:懒加载(lazy)实现原理
目录 代码分割 React的懒加载 import() 原理 React.lazy 原理 Suspense 原理 参考 1.代码分割 (1)为什么要进行代码分割? 现在前端项目基本都采用打包技术,比如 ...
- 从JRaft来看Raft协议实现细节
分布式系统和一致性问题 一致性问题(consensus problem)是分布式系统需要解决的一个核心问题.分布式系统一般是由多个地位相等的节点组成,各个节点之间的交互就好比几个人聚在一起讨论问题.让 ...
- 【JMeter_02】JMeter目录结构与功能模块介绍
安装包目录结构 1.backups: 存放jmeter对脚本的自动备份保存文件 2.bin:jmeter的可执行文件目录,包含启动.配置等相关文件 3.dosc:程序自带的官方文档本地存放目录 4.e ...
- 前后端分离项目 nginx配置实践
新项目采用前后端分离的方式开发,前后端代码打算分开部署(同机器且同域名),但打算支持后端依然可访问静态资源. 搜索nginx配置大部分都通过url前缀进行转发来做前后端分离,不适用目前项目. 说明 前 ...
- MFC基于CAsyncSocket套接字客户端代码示范
MFC基于CAsyncSocket套接字客户端代码示范 https://blog.csdn.net/txwtech/article/details/93016190
- 套接字TCP控制台服务器程序代码示范
套接字TCP控制台服务器程序代码示范 https://blog.csdn.net/txwtech/article/details/90344081