bean的生命周期:bean的创建 —— 初始化 ——销毁的过程

容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期就会调用我们的方法

在xml配置文件中是在bean的标签内使用init-method和destroy-method

<bean id="person" class="com.springbean.Person" init-method="" destroy-method="" >

这里我们使用注解的方法

第一种指定初始化和销毁方法

首先创建一个bean

public class Foo {

    public Foo(){
System.out.println("bean的创建");
} public void init(){
System.out.println("bean的初始化");
} public void destroy(){
System.out.println("bean的销毁");
}
}

创建一个配置类:

@Bean注解上指定初始化和销毁方法
@Configuration
public class MainBeanConfig {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Foo foo(){
  return new Foo();
}
}

测试:

public class BeanTest {

    @Test
public void test(){
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class);
}
}

bean如果没有指定作用域,就是单例的,就在容器加载的时候就会创建bean,所以打印的结果是:

bean的创建
bean的初始化

销毁:当容器关闭的时候,就会调用destroy方法,打印 bean的销毁

applicationContext.close();

如果要指定bean的作用域为prototype,就需要在配置类中MainBeanConfig,加上注解@Scope("prototype"),如

@Bean
@Scope("prototype")
public Foo foo(){
return new Foo();
}
指定bean的作用域为@Scope("prototype"),这时候容器加载的时候就不会创建和初始化bean,而是在获取bean的时候。

容器关闭的时候也不会去调用destroy方法,需要自己手动调用。
第二种我们通过bean实现InitializingBean(定义初始化逻辑)和DisposableBean(定义销毁逻辑)
创建一个类Hero,实现InitializingBean,DisposableBean接口,加上注解@Component
@Component
public class Hero implements InitializingBean,DisposableBean { public Hero(){
System.out.println("创建");
}
@Override
public void destroy() throws Exception {
System.out.println("销毁");
} @Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化");
}
}

在配置中加上注解ComponentScan去扫描包,也可以使用@Import来将组件加入容器中

如:@Import({Hero.class})

@ComponentScan("com.springbean")
public class MainBeanConfig {

测试:

 @Test
public void test(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class);
applicationContext.close();
}

打印结果:

创建
初始化
销毁

第三种使用@PostConstruct(构造器创建之后)和@PreDestroy(容器销毁之前)两个注解,这是JSR250的两个注解。

  @PostConstruct
public void init(){
System.out.println("bean的初始化");
} @PreDestroy
public void destroy(){
System.out.println("bean的销毁");
}

第四种使用BeanPostProcessor后置处理器,这个接口中有两个方法postProcessBeforeInitialization和postProcessAfterInitialization:

public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException; Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}

分别在bean初始化之前执行这个方法,这个类似aop里面的前后通知,写一个实现类MyBeanPostProcesser

/**
*后置处理器,处理前后初始化的工作
*/
@Component
public class MyBeanPostProcesser implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
System.out.println(" postProcessBeforeInitialization ...beanname="+s+",bean="+o);
return o;
} @Override
public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
System.out.println("postProcessAfterInitialization.... beanname="+s+",bean="+o);
return o;
}
}

加入到配置类中MainBeanConfig


@Configuration
@Import({Hero.class, MyBeanPostProcesser.class})
public class MainBeanConfig {
测试:输出结果,是在bean的初始化的前后操作
 postProcessBeforeInitialization ...beanname=com.springbean.Hero,bean=com.springbean.Hero@4ba2ca36
初始化
postProcessAfterInitialization.... beanname=com.springbean.Hero,bean=com.springbean.Hero@4ba2ca36

spring中的bean的生命周期的更多相关文章

  1. (转)Spring管理的Bean的生命周期

    http://blog.csdn.net/yerenyuan_pku/article/details/52834011 bean的初始化时机 前面讲解了Spring容器管理的bean的作用域.接着我们 ...

  2. Spring基础14——Bean的生命周期

    1.IOC容器中的Bean的生命周期方法 SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务.SpringIOC容器对Bean的生命周期进行管理 ...

  3. spring-第八篇之容器中的bean的生命周期

    1.容器中的bean的生命周期 spring容器可以管理singleton作用域的bean的生命周期,包括bean何时被创建.何时初始化完成.何时被销毁.客户端代码不能控制该类型bean的销毁.spr ...

  4. Spring 学习笔记---Bean的生命周期

    生命周期图解 由于Bean的生命周期经历的阶段比较多,我们将通过一个图形化的方式进行描述.下图描述了BeanFactory中Bean生命周期的完整过程: Bean 的生命周期从Spring容器着手实例 ...

  5. Spring实战(二)Spring容器和bean的生命周期

    引入问题: 在XML配置文件中配置bean后,这些文件又是如何被加载的?它们被加载到哪里去了? Spring容器——框架核心 1.什么是Spring容器?它的功能是什么? 在基于Spring的应用中, ...

  6. spring(二):bean的生命周期

    bean的生命周期指的是bean的创建——>初始化——>销毁的过程,该过程是由spring容器进行管理的 我们可以自定义bean初始化和销毁的方法:容器在bean进行到当前生命周期时,调用 ...

  7. Spring初学之bean的生命周期

    实体Bean: Car.java: package spring.beans.cycle; public class Car { private String name; private int pr ...

  8. 面试突击80:说一下 Spring 中 Bean 的生命周期?

    Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Spring IoC 容器来管理的对象.所以 Spring 中的 Bean ...

  9. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring Bean的生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,在此作用域下,Spring 能够精确地知道该 Bean 何时被创建,何时初始化完成,以及何时被销毁. 而对于 protot ...

随机推荐

  1. HDU-3341-Lost's revenge(AC自动机, DP, 压缩)

    链接: https://vjudge.net/problem/HDU-3341 题意: Lost and AekdyCoin are friends. They always play "n ...

  2. Air Raid POJ - 1422 【有向无环图(DAG)的最小路径覆盖【最小不相交路径覆盖】 模板题】

    Consider a town where all the streets are one-way and each street leads from one intersection to ano ...

  3. Cogs 1345. [ZJOI2013] K大数查询(树套树)

    [ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...

  4. 第2组 Alpha冲刺(4/4)

    队名:十一个憨批 组长博客 作业博客 组长黄智 过去两天完成的任务:了解整个游戏的流程 GitHub签入记录 接下来的计划:继续完成游戏 还剩下哪些任务:完成游戏 燃尽图 遇到的困难:没有美术比较好的 ...

  5. 推荐 | Vue 入门&进阶路线

    今儿跟大家聊聊 Vue . 不得不承认, Vue 越来越受欢迎了.对比 Angular 和 React,虽然三者都是非常优秀的前端框架,但从 GitHub 趋势看,Vue 已经排在第一位,达到了13万 ...

  6. 8月清北学堂培训 Day6

    今天是杨思祺老师的讲授~ 图论 双连通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通: 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u ...

  7. MySQL数据分析-(5)数据库设计之ER模型

    大家好,我是jacky,很高兴跟大家分享本课时的内容,从本节课开始,就开始了我们第二章的学习,第一章我们抛出了若干问题,从第二章开始往后,都是解决问题的一个过程: 第一章的案例中,我们拿手机销售公司举 ...

  8. table表格整体居中

    代码: <div style="text-align:center"> <table border="1" cellpadding=" ...

  9. Egyptian Collegiate Programming Contest (ECPC 2015)

    题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...

  10. HDU 4386 Quadrilateral(四边形的海伦公式的应用)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/G 题目大意是给出四条边,问能否组成一个四边形,如果 ...