美文网首页
@PostConstruct注解实现Sping的静态注入Serv

@PostConstruct注解实现Sping的静态注入Serv

作者: 让你变好的过程从来都不会很舒服 | 来源:发表于2021-08-15 16:15 被阅读0次

为什么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();
        }
    }
}

相关文章

网友评论

      本文标题:@PostConstruct注解实现Sping的静态注入Serv

      本文链接:https://www.haomeiwen.com/subject/sjrebltx.html