@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初始化加载之前想处理一些东西,像加载缓存,数据字典,需要提前加载的方法等等。