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

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

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

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

这里我们使用注解的方法

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

首先创建一个bean

  1. public class Foo {
  2.  
  3. public Foo(){
  4. System.out.println("bean的创建");
  5. }
  6.  
  7. public void init(){
  8. System.out.println("bean的初始化");
  9. }
  10.  
  11. public void destroy(){
  12. System.out.println("bean的销毁");
  13. }
  14. }

创建一个配置类:

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

测试:

  1. public class BeanTest {
  2.  
  3. @Test
  4. public void test(){
  5. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class);
  6. }
  7. }

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

bean的创建
bean的初始化

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

  1. applicationContext.close();

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

  1. @Bean
    @Scope("prototype")
    public Foo foo(){
    return new Foo();
    }
  1. 指定bean的作用域为@Scope("prototype"),这时候容器加载的时候就不会创建和初始化bean,而是在获取bean的时候。
  2.  
  3. 容器关闭的时候也不会去调用destroy方法,需要自己手动调用。
  4. 第二种我们通过bean实现InitializingBean(定义初始化逻辑)和DisposableBean(定义销毁逻辑)
    创建一个类Hero,实现InitializingBean,DisposableBean接口,加上注解@Component
  1. @Component
    public class Hero implements InitializingBean,DisposableBean {
  2.  
  3. public Hero(){
  4. System.out.println("创建");
  5. }
  6. @Override
  7. public void destroy() throws Exception {
  8. System.out.println("销毁");
  9. }
  10.  
  11. @Override
  12. public void afterPropertiesSet() throws Exception {
  13. System.out.println("初始化");
  14. }
  15. }

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

如:@Import({Hero.class})

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

测试:

  1. @Test
  2. public void test(){
  3. AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainBeanConfig.class);
  4. applicationContext.close();
  5. }

打印结果:

创建
初始化
销毁

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

  1. @PostConstruct
  2. public void init(){
  3. System.out.println("bean的初始化");
  4. }
  5.  
  6. @PreDestroy
  7. public void destroy(){
  8. System.out.println("bean的销毁");
  9. }

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

  1. public interface BeanPostProcessor {
  2. Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
  3.  
  4. Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
  5. }

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

  1. /**
  2. *后置处理器,处理前后初始化的工作
  3. */
  4. @Component
  5. public class MyBeanPostProcesser implements BeanPostProcessor {
  6. @Override
  7. public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
  8. System.out.println(" postProcessBeforeInitialization ...beanname="+s+",bean="+o);
  9. return o;
  10. }
  11.  
  12. @Override
  13. public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
  14. System.out.println("postProcessAfterInitialization.... beanname="+s+",bean="+o);
  15. return o;
  16. }
  17. }

加入到配置类中MainBeanConfig

  1.  
  1. @Configuration
    @Import({Hero.class, MyBeanPostProcesser.class})
    public class MainBeanConfig {
  1. 测试:输出结果,是在bean的初始化的前后操作
  1. postProcessBeforeInitialization ...beanname=com.springbean.Hero,bean=com.springbean.Hero@4ba2ca36
  2. 初始化
  3. 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. BZOJ 1299: [LLH邀请赛]巧克力棒 【SG函数/博弈分析/高斯消元】

    因为太懒,放个博客 我只写了O(2n)O(2^n)O(2n)的 CODE #include <cstdio> int n, x[15]; int main () { for(int T = ...

  2. 006_linuxC++之_引用

    1. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同.申明一个引用的时候,切记要对其进行初始化.引用声明 ...

  3. java实现文件夹上传

    文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ...

  4. vii

    #!/bin/bash ] then vi exit fi ] then echo "参数太多了!" exit fi ] # 文件已存在,一律直接打开不作任何处理 then exi ...

  5. stark项目流程

    1 创建Django项目 2 创建app python manage.py startapp app名 3 文件配置 app配置 静态文件配置 创建文件夹,下载bootstrap,jquery 归档文 ...

  6. pycham更换主题

    在pycham的file-->Setting-->Editor-->Colors&Fonts

  7. Docker安装mysql5.6

    1.docker hub 上查找mysql镜像 2.在docker hub上(阿里云加速器)拉取mysql镜像到本地标签为5.6 3.使用mysql5.6创建容器(也叫运行镜像) 4.交互运行,进入m ...

  8. SQL-W3School-高级:SQL DEFAULT 约束

    ylbtech-SQL-W3School-高级:SQL DEFAULT 约束 1.返回顶部 1. SQL DEFAULT 约束 DEFAULT 约束用于向列中插入默认值. 如果没有规定其他的值,那么会 ...

  9. android studio gradle国内代理设置

    android studio在开始都各项目之前都会遇到 gradle 的同步,而在同步过程中很多依赖下载特别慢甚至出现无法现在的情况,有的时候等的时间特别长,甚至要一天,关键是等了大半天之后突然报错, ...

  10. Oracle 的 oracle 数据库分类

    一.数据库分类 1.小型数据库:access.foxbase 2.中型数据库:informix.sql server.mysql 3.大型数据库:sybase.db2.oracle 二.项目中如何合理 ...