静态⽅法中注⼊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.Status(), de())
&& CurrentDate().ExpireTime())) {
return "1";
} else {
return "0";
}
}
}
该段代码晃眼⼀看没啥问题,但是运⾏就会null异常,因为此处注⼊的signRepository为null,这是因为静态⽅法是属于类的,普通⽅法才属于对象,spring注⼊是在容器中实例化变量的,并且静态是优先于对象存在的,所以直接在静态⽅法中调⽤注⼊的静态变量其实是为null 的,针对这点不太明⽩的,可以⾃⾏补⼀下java基础。
但是现实当中我们很多情况需要再静态⽅法中调⽤注⼊的bean对象,要怎么样实现呢?我⽬前知道的有两种⽅法。
解决问题:
1. @Autowired ⽤在构造函数上
我们知道@Autowired 注释,可以对类成员变量、⽅法及构造函数进⾏标注,完成⾃动装配的⼯作,此种⽅式就是在构造函数上使⽤
@Autowired。
代码参考:
@Component
public class ScriptExecuteContent {实例化bean的三种方式
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.Status(), de())
&& CurrentDate().ExpireTime())) {
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.Status(), de())
&& CurrentDate().ExpireTime())) {
return "1";
} else {
return "0";
}
}
}
总结:以上两种⽅式都能实现静态⽅法中直接使⽤注⼊的bean对象,实现⽅式肯定不⽌这两种,⾃⼰基础差了,⽬前只知道这两种。