为什么static对象不可直接使用@Autowired注入?
Spring/SpringBoot正常情况下不能支持注入静态属性(会报空指针异常)。主要原因在于:Spring的依赖注入实际上是使用Object.Set()进行注入的,Spring是基于对象层面的依赖注入,而静态属性/静态变量实际上是属于类的。
简单来说就是,static是项目启动时就会执行,在整个生命周期中,较早,但是Spring注入的时候可能该类还没有注入到容器,可能会出现运行时异常。
@PostConstruct和@PreDestroy
1、@PostConstruct 为JavaEE5规范开始后Servlet中新增@PostConstruct和@PreDestroy
2、被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。
3、@PostConstruct 在构造函数之后执行,init()方法之前执行。
4、@PreDestroy()方法在destroy()方法之后执行
范例
@Component
public class SendSmsUtils {
/**
* 短信发送记录表 service接口
*/
@Autowired
private ISmsSendRecordService smsSendRecordService;
public static SendSmsUtils staticInstance;
@PostConstruct
public void init(){
staticInstance = this;
staticInstance.smsSendRecordService = this.smsSendRecordService;
}
/**
*
* 保存短信日志记录
* @author wuxx
* @date: 2019年11月13日 上午9:58:00
*/
public static void saveSmsSendRecord(String phone, String message,String result){
try {
SmsSendRecord smsSendRecord = new SmsSendRecord();
smsSendRecord.setReceviceUsers(phone);
smsSendRecord.setContent(message);
smsSendRecord.setResult(result);
smsSendRecord.setSendDate(new Date());
// 这样就可以进行调用smsSendRecordService 中的方法
staticInstance.smsSendRecordService.saveSmsSendRecord(smsSendRecord);
} catch (Exception e) {
e.printStackTrace();
}
}
}
网友评论