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注解开发系列Ⅲ --- 生命周期的更多相关文章

  1. 浅尝Spring注解开发_Bean生命周期及执行过程

    Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含Bean生命周期.自定义初始化方法.Debug BeanPostProcessor执行过程及在Spring底层中的应 ...

  2. Spring注解开发系列Ⅵ --- AOP&事务

    注解开发 --- AOP AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,横向重复,纵向抽取.详细的AO ...

  3. Spring注解开发系列专栏

    这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...

  4. Spring注解开发系列VIII --- SpringMVC

    SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进 ...

  5. Spring注解开发系列Ⅰ--- 组件注册(上)

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...

  6. Spring注解开发系列Ⅴ --- 自动装配&Profile

    自动装配: spring利用依赖注入和DI完成对IOC容器中各个组件的依赖关系赋值.自动装配的优点有: 自动装配可以大大地减少属性和构造器参数的指派. 自动装配也可以在解析对象时更新配置. 自动装配的 ...

  7. Spring注解开发系列VII --- Servlet3.0

    Servlet3.0简介 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用 ...

  8. Spring注解开发系列Ⅱ --- 组件注册(下)

    1.@Import注册组件 @Import主要功能是通过导入的方式实现把实例加入springIOC容器中, /** * 给容器注册组件 * 1.包扫描+组件标注注解(@Controller,@Serv ...

  9. Spring注解开发系列Ⅳ --- 属性赋值

    在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...

随机推荐

  1. [梁山好汉说IT] 边缘计算在梁山的应用

    [梁山好汉说IT] 边缘计算在梁山的应用 0x00 摘要 梁山泊下四个酒店就是边缘计算在梁山的应用,以朱贵南山酒店为例能看出其"计算实时/省流量/具备智能"等各种优点. 0x01 ...

  2. 搭建高可用的flink JobManager HA

    JobManager协调每个flink应用的部署,它负责执行定时任务和资源管理. 每一个Flink集群都有一个jobManager, 如果jobManager出现问题之后,将不能提交新的任务和运行新任 ...

  3. 20191010-7 alpha week 1/2 Scrum立会报告+燃尽图 06

    此作业参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8750 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐丽 ...

  4. $Noip2011/Luogu1311$ 选择客栈

    $Luogu$ $Sol$ 暴力十分显然叭.正解不是很好想. 我最开始想维护所有色调的客栈的前缀和后缀,然后每扫到一个最低消费合法的就统计一次答案.但是这样会重复计数,两个合法客栈之间有几个消费合法的 ...

  5. Ural1057. Amount of Degrees 题解 数位DP

    题目链接: (请自行百度进Ural然后查看题号为1057的那道题目囧~) 题目大意: Create a code to determine the amount of integers, lying ...

  6. Linux入门系列1--环境准备及Linux安装

    "工欲善其事.必先利其器",本文作为"Linux零基础入门系列"开篇,将完整演示整个开发环境的安装和配置过程,为后续的开发和实验做好基础准备.如果您已安装好环境 ...

  7. 《吊打面试官》系列-ArrayList

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...

  8. Spark学习笔记(二)—— Local模式

    Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍第一种模式. 1.Lo ...

  9. 解决阿里云专有网络ftp无法远程链接

    配置好ftp后本机测试可用但无法远程连接 网络上找了很多方法,配置防火墙出入站规则均无效 提交阿里云工单,给出解决方法,测试后可用

  10. Go Web 编程之 程序结构

    概述 一个典型的 Go Web 程序结构如下,摘自<Go Web 编程>: 客户端发送请求: 服务器中的多路复用器收到请求: 多路复用器根据请求的 URL 找到注册的处理器,将请求交由处理 ...