@PostConstruct和@PreDestroy

xiaoxiao2025-11-16  9

@PostConstruct和@PreDestroy

在用微信插件的时候,发现路由不知道在哪里加载进去,然后就可以直接使用。

@Override public void refreshRouter() { final WxMpMessageRouter newRouter = new WxMpMessageRouter( this.wxMpService); // 记录所有事件的日志 newRouter.rule().handler(this.logHandler).next(); /*// 关注事件 newRouter.rule().async(false).msgType(WxConsts.XML_MSG_EVENT) .event(WxConsts.EVT_SUBSCRIBE).handler(this.subscribeHandler) .end(); //取消关注事件 newRouter.rule().async(false).msgType(WxConsts.XML_MSG_EVENT) .event(WxConsts.EVT_UNSUBSCRIBE).handler(this.unsubscribeHandler) .end(); //用户点击菜单推送事件 newRouter.rule().async(false).msgType(WxConsts.XML_MSG_EVENT) .event(WxConsts.BUTTON_CLICK).handler(this.clickHandler) .end();*/ //用户输入文本消息 newRouter.rule().async(false).msgType(WxConsts.XML_MSG_TEXT) .handler(this.serviceHandler) .end(); //模板推送后微信服务器返回是否送达成功信息 newRouter.rule().async(false).msgType(WxConsts.XML_MSG_EVENT) .event(WxConsts.EVT_TEMPLATESENDJOBFINISH).handler(this.templateSendHandler) .end(); // 默认,转发消息给客服人员 newRouter.rule().async(false).handler(this.msgHandler).end(); this.router = newRouter; }

发现在一个init方法上执行了一次,但是没有调用init方法,该方法上有@PostConstruct

@PostConstruct public void init() { this.refreshRouter(); }

作用

被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行

//写法一 @PostConstruct Public void test() {} //写法二 public @PostConstruct void test(){}

执行顺序(spring容器->springmvc容器)

涉及到web.xml执行顺序

Constructor -> @Autowired -> @PostConstruct

服务器加载Servlet->Servlet构造函数->PostConstruct->Init->Service->destory->PreDestory->服务器卸载Servlet完毕

使用场景

在servlet初始化加载之前想处理一些东西,像加载缓存,数据字典,需要提前加载的方法等等。

转载请注明原文地址: https://www.6miu.com/read-5039742.html

最新回复(0)