美文网首页
@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