Spring注解开发系列Ⅲ --- 生命周期
Bean的生命周期
Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。
首先看下生命周期图:

再谈生命周期之前有一点需要先明确:
Spring 只帮我们管理单例模式 Bean 的完整生命周期,对于 prototype 的 bean ,Spring 在创建好交给使用者之后则不会再管理后续的生命周期。
Bean的初始化和销毁方法
/**
* Bean的生命周期
* ---由容器管理bean的创建,初始化,销毁
*
* 构造,创建对象
* 单实例:在容器启动的时候创建对象
* 多实例:在每次获取的时候创建对象
*
* 初始化:
* 对象创建完成,并赋值好,然后调用初始化方法...
* 销毁:
* 单实例:容器关闭时,进行销毁
* 多实例:容器不会管理这个bean,bean不会销毁
* 1).使用自定义的初始化和销毁方法
* 指定init-methdo和destroy-method
*
* 2)使用InitializingBean和DisposableBean初始化和销毁方法
*
* 3)使用@PostConstruct&@PreDestroy
* @PostConstruct 在bean创建完成并属性赋值完成,执行初始化方法
* @PreDestroy 在容器销毁前通知我们清理
*
* 4)BeanPostProcessor,bean的后置处理器
* ---1.postProcessBeforeInitialization 在bean的初始化方法之前进行一些处理工作
* ---2.执行初始化方法
* ---3.postProcessAfterInitialization 在bean的初始化方法调用之后进行调用
*
* Spring底层对BeanPostProcessor的使用:
* bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Asybc等都是通过BeanPostProcessor完成的
*
* */
1.@Bean指定初始化和销毁方法
在bean初始化的时执行init方法,销毁时执行destroy方法
实体类:
package com.wang.bean;
public class Car {
public Car(){
System.out.println("car cons...");
}
public void init(){
System.out.println("car init...");
}
public void destroy(){
System.out.println("car destroy...");
}
}
xml方式:
<bean id="car" class="com.wang.bean.Car" scope="prototype" lazy-init="true" init-method="init" destroy-method="destroy">
</bean>
注解方式:
@Configuration
public class LifeCycleConfig {
//@Scope("prototype")
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car car(){
return new Car();
}
}
Test:
@Test
public void test(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
System.out.println("容器创建完成"); annotationConfigApplicationContext.getBean("car");//多实例,获取bean时调用创建对象,容器关闭不会销毁bean
annotationConfigApplicationContext.close();//关闭容器,执行销毁方法 }
2.InitializingBean和DisposableBean初始化和销毁方法
在实体类中实现InitializingBean和DisposableBean接口:
public class Car implements InitializingBean,DisposableBean {
public Car(){
System.out.println("car cons...");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet...在properties设置之后调用(初始化方法)");
}
@Override
public void destroy() throws Exception {
System.out.println("destroy方法");
}
}
在配置类中注册该实体类bean:
@Bean
public Car car(){
return new Car();
}
3.@PostConstruct&@PreDestroy
@PostConstruct 在bean创建完成并属性赋值完成,执行初始化方法,@PreDestroy 在容器销毁前通知我们清理
实体类:
public class Dog {
public Dog(){
System.out.println("Dog Cons...");
}
@PostConstruct
public void init(){
System.out.println("Dog PostConstruct...");
}
@PreDestroy
public void destroy(){
System.out.println("Dog PreDestroy...");
}
}
在配置类中注册该实体类bean:
@Bean
public Dog dog(){
return new Dog();
}
4.BeanPostProcessor
执行顺序为:
1.postProcessBeforeInitialization 在bean的初始化方法之前进行一些处理工作
2.执行初始化方法
3.postProcessAfterInitialization 在bean的初始化方法调用之后进行调用
@Component //将后置处理器加入容器中
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessBeforeInitialization is run ...."+"bean:"+bean+"=>beanName:"+beanName); //返回要用的bean对象
return bean;
} @Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("postProcessAfterInitialization is run ...."+"bean:"+bean+"=>beanName:"+beanName);
return bean;
}
}
Spring注解开发系列Ⅲ --- 生命周期的更多相关文章
- 浅尝Spring注解开发_Bean生命周期及执行过程
Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含Bean生命周期.自定义初始化方法.Debug BeanPostProcessor执行过程及在Spring底层中的应 ...
- Spring注解开发系列Ⅵ --- AOP&事务
注解开发 --- AOP AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,横向重复,纵向抽取.详细的AO ...
- Spring注解开发系列专栏
这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...
- Spring注解开发系列VIII --- SpringMVC
SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进 ...
- Spring注解开发系列Ⅰ--- 组件注册(上)
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- Spring注解开发系列Ⅴ --- 自动装配&Profile
自动装配: spring利用依赖注入和DI完成对IOC容器中各个组件的依赖关系赋值.自动装配的优点有: 自动装配可以大大地减少属性和构造器参数的指派. 自动装配也可以在解析对象时更新配置. 自动装配的 ...
- Spring注解开发系列VII --- Servlet3.0
Servlet3.0简介 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用 ...
- Spring注解开发系列Ⅱ --- 组件注册(下)
1.@Import注册组件 @Import主要功能是通过导入的方式实现把实例加入springIOC容器中, /** * 给容器注册组件 * 1.包扫描+组件标注注解(@Controller,@Serv ...
- Spring注解开发系列Ⅳ --- 属性赋值
在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...
随机推荐
- 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)
前言: 干了这么多年的iOS,虽然接触了许多七七八八的东西.技术,但是感觉本身iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己 ...
- jquery $.post()返回数据
javawe项目很多情况下需要通过$.post()进行前端和后端传递数据 格式是: $.post(url,data,function(result,statue){ alert(result); }, ...
- layui treeSelect
官方地址:https://fly.layui.com/extend/treeSelect/ 下面介绍一下这个插件的使用方法 1.html页面 <div class="layui-inp ...
- FPM简介(定制rpm包)
FPM简介 fpm是生成rpm包的工具.rpm包的制作,采用fpm工具完成,FPM非常易用,此命令可以把rpm包的安装.卸载做得更加优雅,在安装前可以做一些准备工作,安装后可以做一些收尾工作,在卸载前 ...
- 从头学pytorch(十二):模型保存和加载
模型读取和存储 总结下来,就是几个函数 torch.load()/torch.save() 通过python的pickle完成序列化与反序列化.完成内存<-->磁盘转换. Module.s ...
- SQL MAX()函数处理字符型字段
假设有数据库表student,表中有字段studentCode,它是字符型的,现有需求:“每次向student表插入数据时,自动生成studentCode字段的值” 如果你的实现思路是这样的: if( ...
- 微信小程序背景音乐官方实例代码无效问题解决及音乐src获取方法
最近在学习微信小程序时遇到了个问题:官方的背景音乐的api实例代码中的音乐src不管用(可能有期限,后面的方法获取的src同样可能有期限),因此本人只能自己去寻找办法获取src,现将方法记录在下面.( ...
- Jenkins+ant+jmeter环境搭建
下载的工具版本: apache-jmeter-3.0 apache-ant-1.8.4 jenkins-2.46.3 之前用jmeter写了测试接口的脚本,运行及返回结果都正常,所以需要做的就是工具的 ...
- 兄弟们,你们天天吊打面试官,面试官很难受啊。 metasploit免S客户端
metasploit生成的exe文件很小,但是免杀效果不行, 找了很多资料, 只有生成c语言shellcode,然后c#重新编译, 这种免杀效果,挺让人满意的 首先需要生成客户端,客户端使用了ngro ...
- 2019牛客暑期多校第一场题解ABCEFHJ
A.Equivalent Prefixes 传送门 题意:给你两个数组,求从第一个元素开始到第p个元素 满足任意区间值最小的元素下标相同的 p的最大值. 题解:我们可以从左往右记录到i为止每个区间的最 ...