
嘻道奇闻
- 文章199742
- 阅读14625734
Servlet生命周期核心方法详解:从init()到destroy()的正确使用场景
(开头提问)你说学Java Web开发总绕不过Servlet,但它的生命周期方法到底怎么用?为什么有人写的Servlet跑得溜溜的,有人却总遇到"404"或者内存泄漏?今天咱们就掰开了揉碎了聊这事儿!
??一、Servlet的"出生证明":init()方法??
Servlet可不是凭空蹦出来的,??它的第一条命是init()给的??。这方法就像新生儿的第一声啼哭,容器(比如Tomcat)在创建Servlet实例时必会调用它。你可能会问:"这玩意儿用不用都行吧?" 哎!这里就有坑了——很多人直接忽略init(),结果后面各种参数取不到。
举个栗子:假设你要加载数据库配置,直接在构造方法里写?大错特错!??构造方法是给JVM用的,init()才是Servlet的专属启动按钮??。正确的姿势是这么玩:
java复制public void init() throws ServletException { // 这里加载配置文件 configParams = getInitParameter("dbConfig"); // 初始化数据库连接池... }
??重要知识点三连:??
- init()在整个生命周期只执行一次
- 可以通过getServletConfig()获取配置信息
- 如果初始化失败直接抛出ServletException,容器会处理后续
??二、服务期的扛把子:service()方法??
到了服务阶段,??service()就是Servlet的CPU??。你以为doGet/doPost是主角?其实它们都是service()的打工仔!这里有个90%新手会犯的错——重写service()却不调用父类方法,结果请求直接石沉大海。
看个对比表更清楚:
??正确姿势?? | ??错误示范?? |
---|---|
先super.service() | 直接处理请求 |
处理通用逻辑 | 忘记处理其他HTTP方法 |
维护线程安全 | 在方法内创建全局变量 |
??敲黑板重点:??
- service()就像交通警察,把GET/POST请求分派给对应方法
- 要加通用校验(比如登录验证)就在这里搞
- ??千万别在这里搞耗时操作??,否则并发量上来服务器直接躺平
??三、退休仪式:destroy()方法??
说到销毁方法,很多小白觉得:"反正程序都关了,管它干啥?" 这就是典型的内存泄漏预备队员!??destroy()是Servlet最后的体面退场??,数据库连接池不关?文件句柄不释放?等着服务器重启后报错吧!
看段标准操作:
java复制public void destroy() { // 关闭数据库连接池 dataSource.close(); // 清理缓存数据 cacheManager.clear(); }
??必知三原则:??
- 容器在卸载Servlet前必调destroy()
- 要确保所有线程都已完成
- 调用后实例进入可回收状态
??四、那些年踩过的坑(真实案例)??
上周帮学弟排查的诡异问题:用户登录后偶尔跳转到别人账号。你猜怎么着???把用户信息存在Servlet的成员变量里了??!这就好比用公共碗筷吃饭——Servlet是单例的,所有用户共享实例变量,不出乱子才怪!
??正确做法清单:??
? 请求相关数据存request/session
? 共享资源用synchronized保护
? 耗资源的操作放局部变量
??五、个人私货时间??
搞了这么多年Java Web,发现很多开发者把Servlet当"过时技术",其实??生命周期管理的思想在Spring MVC里照样适用??。现在流行注解配置不假,但你要是能理解透init()-service()-destroy()这套机制,看源码时就跟开了天眼似的。
最后说句掏心窝的话:Servlet就像武侠小说里的内功心法,框架再花哨也是招式。把生命周期这几个方法玩明白了,往后学什么Struts、Spring MVC,那都是手到擒来!