Spring-对象生命周期管理

2019-01-09  本文已影响20人  do_young

简述

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

如果是单例的对象:

如果是多例的对象:

下面具体介绍,如何使用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和接口的情况下会出现什么情况呢?
通过测试会发现:

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

了为实现对对象初始化前后的控制,需要实现一个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");
    }
上一篇 下一篇

猜你喜欢

热点阅读