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 ...
随机推荐
- spring boot(一)创建项目
网上有很多springboot的入门教程,自己也因为项目要使用springboot,所以利用业余时间自学了下springboot和springcloud,使用下来发现springboot还是挺简单的, ...
- SVN+Apache+IF.svnadmin支持https实现web管理SVN
一,软件准备 .安装apache [root@localhost ~]# yum install httpd -y .安装svn服务器(其中,mod_dav_svn是apache服务器访问svn的一个 ...
- WPF继续响应被标记为已处理事件的方法
WPF继续响应被标记为已处理事件的方法 WPF中在冒泡事件或者隧道事件会随其层间关系在visual tree上层层传递,但是,某些事件传递到某些控件是即会”终止“(不再响应相应的注册事件),给人一种事 ...
- 【题解】有标号的DAG计数1
[HZOI 2015] 有标号的DAG计数 I 设\(f_i\)为\(i\)个点时的DAG图,(不必联通) 考虑如何转移,由于一个DAG必然有至少一个出度为\(0\)的点,所以我们钦定多少个出度为\( ...
- POJ2186 Popular Cows 题解 强连通分量
题目链接:http://poj.org/problem?id=2186 题目大意: 每头牛都想成为牛群中的红人. 给定N头牛的牛群和M个有序对(A, B),(A, B)表示牛A认为牛B是红人: 该关系 ...
- 1034 有理数四则运算 (20 分)C语言
题目描述 本题要求编写程序,计算2个有理数的和.差.积.商. 输入描述: 输入在一行中按照"a1/b1 a2/b2"的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整 ...
- zabbix安装和使用
前言:zabbix是一款很好用的监控工具,相比nagios(也是监控工具的一种)而言,zabbix提供了强大的视图界面,操作简单,功能强大,只需在页面配置即可,让你用的开心,回家放心. zabbix监 ...
- 基于Antd框架的通信与交互
基于Antd框架的通信与交互 1.与用户交互 对于input输入框,在于用户交互的过程中,用户在输入任何东西时,都会引起该组件的onChange事件(如果写有这个方法的话). <FormItem ...
- 《图解机器学习-杉山将著》读书笔记---CH5
CH5 稀疏学习 重点提炼 提出稀疏学习的缘故: 虽然带有约束条件的最小二乘学习法结合交叉验证法,在实际应用中是非常有效的回归方法,但是,当参数特别多时,计算参数以及预测值需要大量时间.此时,我们要解 ...
- Java框架之Spring01-IOC-bean配置-文件引入-注解装配
Spring 框架,即framework.是对特定应用领域中的应用系统的部分设计和实现的整体结构.就相当于让别人帮你完成一些基础工作,它可以处理系统很多细节问题,而且框架一般是成熟,稳健的. Spri ...