美文网首页
Spring-对象生命周期管理

Spring-对象生命周期管理

作者: do_young | 来源:发表于2019-01-09 13:46 被阅读20次

简述

Spring对对象生命周期的依次分为:

  • 对象的创建(Construct)
  • 对象的初始化前(BeforeInit)
  • 对象创建之后(PostConstruct)
  • 对象的初始化(Init)
  • 对象的初始化后(AfterInit)
  • 对象销毁前(PreDestroy)
  • 对象的销毁(Destroy)

如果是单例的对象:

  • 在容器启动的时候调用构造方法创建对象。
  • 在容器关闭的时候调用销毁方法销毁对象。

如果是多例的对象:

  • 每次调用的时候调用构造方法创建对象。
  • 容器不会管理这个bean;容器不会调用销毁方法;

下面具体介绍,如何使用spring来对对象的各个生命周期进行管理。

自定义初始化和销毁方法

通过xml

    <bean id="user" class="com.going.spring.bean.User"  init-method="init" destroy-method="destroy">
        <property name="age" value="1"></property>
        <property name="name" value="doyoung"></property>
        <property name="nickName" value="doyoungdy"></property>
    </bean>

通过接口

对象需要实现InitializingBean的afterPropertiesSet方法和DisposableBean的destroy方法

public class User implements InitializingBean,DisposableBean{
......
    public void destroy() {
        System.out.println("user destory");
    }
    
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("user afterPropertiesSet");
    }
......
}

通过注解

    // 给容器中注册一个Bean;类型为返回值的类型,id默认是用方法名作为id
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public UserAnno userAnno() {
        return new UserAnno("doyoung", 20, "doyoungdy");
    }

问题

当对象不但配置了xml和接口的情况下会出现什么情况呢?
通过测试会发现:

  • 当xml的init-method为afterPropertiesSet方法时,或destroy-method为destory方法时,只会调用一次
  • 当xml的init-method不为afterPropertiesSet方法时,或destroy-method不为destory方法时,先调接口的方法再调用xml配置的方法

实现对象的初始化前后的控制

了为实现对对象初始化前后的控制,需要实现一个BeanPostProcessor接口,即在接口InitializingBeanafterPropertiesSet方法前后执行,或在xml中对对象的init-method配置的方法前后执行。
如果有配置注解PostConstruct,它将在PostConstruct之前执行)该接口具体定义如下:

package org.springframework.beans.factory.config;

import org.springframework.beans.BeansException;
public interface BeanPostProcessor {
        /** 对对象的初始化前的控制*/
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
        /** 对对象的初始化后的控制*/
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

我们也可以看到spring实现了很多的BeanPostProcessor,来实现对象生命周期的管理。


BeanPostProcessor.png

实现对象构造后及销毁前的控制

对这两个结点的控制实际是为了实现对JSR250的支持。通过使用注解:
@PostConstruct:在对象创建完成并且属性赋值完成,通过调用注解标注的方法完成其它工作。
@PreDestroy:在容器销毁bean之前,通过调用注解标注的方法对对象进行清理工作。

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
......
    @PostConstruct
    public void postConstruct() {
        System.out.println("user PostConstruct");
    }
    
    @PreDestroy
    public void preDestroy() {
        System.out.println("user PreDestroy");
    }

相关文章

  • Spring-对象生命周期管理

    简述 Spring对对象生命周期的依次分为: 对象的创建(Construct) 对象的初始化前(BeforeIni...

  • UIViewController

    视图控制器的生命周期: 面向对象的语言中是对象就一定要有生命周期,生命周期管理UIViewController的作...

  • Hibernate学习笔记 | 管理Session对象的方法

    管理Session Hibernate自身提供了三种管理Session对象的方法 Session对象的生命周期与本...

  • Android优化-内存优化总结篇

    一、Android内存管理机制 1、Java对象的生命周期 Java对象的生命周期经历7个阶段,分别是创建阶段、应...

  • spring-生命周期

    四个阶段: 实例化 Instantiation 属性赋值 Populate 初始化 Initialization ...

  • Spring IoC 容器

    典型的工厂模式。 容器负责创建对象,管理生命周期,Spring容器使用依赖注入(DI)来管理,这些对象称为Spri...

  • Lifecycle,LifecycleProcessor,Def

    Lifecycle LifeCycle定义Spring容器对象的生命周期,任何spring管理对象都可以实现该接口...

  • Spring Boot自学(十) Spring IOC思想简述-

    简单的说,ioc--控制反转,就是把对象生命周期的管理权限交给Spring去管理。不管是对象的创建还是对象...

  • SpringIOC AOP

    IOC:通过IOC容器来管理所有对象的生命周期,将对象的声明周期交由IOC容器进行管理,不需要自己手动new对象,...

  • iOS - CoreData介绍和简单使用

    Core Data Core Data是苹果官方提供的一套框架,用来解决对象生命周期管理、对象关系图管理和持久化等...

网友评论

      本文标题:Spring-对象生命周期管理

      本文链接:https://www.haomeiwen.com/subject/vuxkrqtx.html