论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
bean的生命周期
bean的生命周期
曂沅仴駦
金牌会员
|
2025-1-21 13:57:27
|
显示全部楼层
|
阅读模式
楼主
主题
861
|
帖子
861
|
积分
2583
bean的生命周期
bean的生命周期指的就是bean从创建到销毁的过程
初始化容器
创建对象(内存分配)
执行构造方法
执行属性注入(set操作)
执行bean初始化方法
使用bean
执行业务操作
关闭/销毁容器
执行bean的销毁方法
管理bean的生命周期有两种方式,一种通过xml配置,一种通过接口实现方法
第一种 通过xml配置管理
编写初始方法和销毁方法
在初始方法和销毁方法中写好我们需要做的事
比方,当我们需要在UserService初始化和销毁时做一些事,我们可以这样写:
public class UserServiceImpl implements UserService {
private UserMapper userMapper;
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public User getUserById(String id) {
if (StringUtils.hasLength(id)) {
//模拟获取用户
User user = userMapper.selectById(id);
System.out.println("user = " + user.toString());
return user;
}
//模拟未找到用户
System.out.println("用户id为空");
return null;
}
public void init(){
System.out.println("初始化UserService方法!!!");
}
public void destory(){
System.out.println("销毁UserService方法!!!");
}
}
复制代码
其中init和destory分别是初始化和销毁方法,名字可以自定义,当我们使用xml来配置这初始化和销毁方法时,应该注意:
初始化方法和销毁方法必须是无参数的
随后我们就可以开始配置spring.xml
<bean id="userMapper" >
</bean>
<bean id="userService" init-method="init" destroy-method="destory">
<property name="userMapper" ref="userMapper"/>
</bean>
复制代码
第二种 使用接口
spring提供了两个接口来自定义初始化和销毁方法
InitializingBean,DisposableBean
这两个接口各自有一个需要重写的方法
InitializingBean -> afterPropertiesSet()
DisposableBean -> destroy()
我们在这两个方法中写好我们初始化和销毁时需要做的内容
@Override
public void destroy() throws Exception {
System.out.println("销毁UserService方法!!!");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化UserService方法!!!");
}
复制代码
我们在xml中也就不需要再指定init-method和destroy-method
<bean id="userMapper" >
</bean>
<bean id="userService" >
<property name="userMapper" ref="userMapper"/>
</bean>
复制代码
Application的main方法:
public class StudySpringApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
UserServiceImpl userService = (UserServiceImpl) ctx.getBean("userService");
User user = userService.getUserById("1");
}
}
复制代码
xml方式执行效果:
接口方式执行效果:
为什么只执行了初始化,却没有执行销毁方法呢
因为在程序执行结束后,jvm虚拟机被关闭时没有给容器销毁bean的机会
我们可以选择手动关闭spring容器
在Application的main方法中加上close方法
public class StudySpringApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
UserServiceImpl userService = (UserServiceImpl) ctx.getBean("userService");
User user = userService.getUserById("1");
ctx.close();
}
}
复制代码
或者在main方法中new ClassPathXmlApplicationContext("spring.xml")后的恣意位置调用ctx.registerShutdownHook()
public class StudySpringApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
ctx.registerShutdownHook();
UserServiceImpl userService = (UserServiceImpl) ctx.getBean("userService");
User user = userService.getUserById("1");
}
}
复制代码
这两者的区别在于close方法会强制关闭IOC容器,执行完close方法后,无法再通过getBean获取容器中的bean
而registerShutdownHook方法可以放在方法的其他地方,不需要担心位置导致容器被关闭,这个方法会让IOC容器在jvm关闭前先执行关闭容器
尝试执行:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
曂沅仴駦
金牌会员
这个人很懒什么都没写!
楼主热帖
教你如何解决T+0的问题
ICA:1靶场
Excel文件校验
国内IT硬件如何铸就新辉煌? ...
JS中的Set与Map
架构设计基础设施保障IaaS之计算篇 ...
监控和可观测性的异同究竟是什么? ...
实时展示用户上传的头像
必知必会的设计原则——迪米特原则 ...
如何筑造数据安全边界
标签云
挺好的
服务器
快速回复
返回顶部
返回列表