Spring生命周期各种接口使用

1,BeanPostProcessor接口;
不能在POJO上面使用,需要单独找一个类进行使用;
如果在POJO上面实现了此接口,在实现了其他*Aware
接口之后,这个接口方法将不会被调用;
2, POJO实现了BeanNameAware接口;
可以与BeanPostProcessor同时使用;
3, POJO实现了BeanFactoryAware接口;
可以与BeanPostProcessor同时使用;
4, POJO实现了ApplicationContextAware接口;
可以与BeanPostProcessor同时使用;
5,POJO实现了DisposableBean接口;
可以正常调用接口的dispose()方法;
6,在bean声明部分定义的init-method
和destroy-method方法可以正常调用;
7,如果调用dispose()、destroy-method方法,
需要使用
AbstractApplicationContext context =
new ClassPathXmlApplicationContext("appbeans.xml");
//...
context.registerShutdownHook();

声明周期图:

http://my.oschina.net/u/218421/blog/37743

package com.stono.sprtest;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Minstrel implements BeanNameAware, BeanFactoryAware,
        ApplicationContextAware, InitializingBean, DisposableBean {

    public static void main(String[] args) {
        AbstractApplicationContext context = new ClassPathXmlApplicationContext(
                "appbeans.xml");
        Minstrel minstrel = (Minstrel) context.getBean("minstrel");
        minstrel.show();
        context.registerShutdownHook();
    }

    private String accordion;
    private Logger logger = Logger.getLogger(Minstrel.class);

    private String song;

    public Minstrel() {
        logger.info("default constructor");
    }

    public Minstrel(String song) {
        logger.info("song constructor");
        this.song = song;
    }

    public Minstrel(String song, String accordion) {
        logger.info("song accordion constructor");
        this.song = song;
        this.accordion = accordion;
    }

    public void destroyMethod() {
        logger.info("destroyMethod called");
    }

    public String getAccordion() {
        logger.info("getAccordion method");
        return accordion;
    }

    public String getSong() {
        logger.info("getSong method");
        return song;
    }

    public void initMethod() {
        logger.info("initMethod called");
    }

    public void setAccordion(String accordion) {
        logger.info("setAccordion method");
        this.accordion = accordion;
    }

    public void setSong(String song) {
        logger.info("setSong method");
        this.song = song;
    }

    public void show() {
        System.out.println("show method called");
    }

    @Override
    public void setBeanName(String name) {
        logger.info("com.stono.sprtest.Minstrel.setBeanName(String):" + name);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        logger.info("com.stono.sprtest.Minstrel.setBeanFactory(BeanFactory):"
                + beanFactory);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        logger.info("com.stono.sprtest.Minstrel.setApplicationContext(ApplicationContext):"
                + applicationContext);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        logger.info("com.stono.sprtest.Minstrel.afterPropertiesSet()");
    }

    @Override
    public void destroy() throws Exception {
        logger.info("com.stono.sprtest.Minstrel.destroy()");
    }

}
package com.stono.sprtest;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class AppBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessBeforeInitialization is called");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessAfterInitialization is called");
        return bean;
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="minstrel" class="com.stono.sprtest.Minstrel"
        init-method="initMethod" destroy-method="destroyMethod">
        <constructor-arg name="song" value="SongSong"></constructor-arg>
        <property name="accordion">
            <value>oldAccordion</value>
        </property>
    </bean>
    <bean class="com.stono.sprtest.AppBeanPostProcessor"></bean>
</beans>
时间: 2024-11-05 18:33:12

Spring生命周期各种接口使用的相关文章

几种自定义Spring生命周期的初始化和销毁方法

Bean 的生命周期指的是 Bean 的创建.初始化.销毁的过程.Spring 提供了一些方法,可以让开发自定义实现在生命周期过程中执行一些额外操作. 1.在注解 @Bean 中指定初始化和销毁时执行的方法名. @Component public class Cat { public Cat() { System.out.println("new Cat()"); } void initMethod() { System.out.println("调用init初始化*****

玩转Spring生命周期之Lifecycle

要与容器的bean生命周期管理交互,即容器在启动后和容器在销毁前对每个bean执行操作,有如下三种方法: 1.实现Spring框架的InitializingBean和DisposableBean接口.容器为前者调用afterPropertiesSet()方法,为后者调用destroy()方法,以允许bean在初始化和销毁bean时执行某些操作. public class HelloLifeCycle implements InitializingBean, DisposableBean { pu

tomcat生命周期的管理——生命周期统一接口Lifecycle

我们知道Tomcat的架构设计是清晰的.模块化的,其拥有很多组件,假如我们要启动Tomcat,可以一个一个启动组件,但这样启动有很多缺点,不仅麻烦,而且容易漏了组件启动,还会对后面动态组件扩展带来麻烦.难不成真要我们一个一个启动吗?其实未必,Tomcat的设计者提供了一个解决方案:用Lifecycle管理启动.停止.关闭. 从第一节的架构图可以看到各个核心组件有包含与被包含的关系,例如Server<-Service<-Container和Connector,最大的是Server,往下一层层包含

Spring中Bean的生命周期解读

Spring容器中的Bean拥有明确的生命周期,由多个特定的生命阶段组成,每个生命阶段都允许外界对Bean施加控制.在Spring中,我们从Bean的作用范围和实例化Bean时所经历的一系列阶段来描述Bean的生命周期: BeanFactory中的Bean的生命周期 简单可分为三类 1.Bean自身的方法 (调用Bean的构造函数实例化Bean,调用setter方法设置Bean的属性值,以及通过配置文件当中的Bean的Init-method和Destory-method方法) 2.Bean生命周

Spring Bean的生命周期详解

Spring Bean的生命周期详解 Spring IoC容器的本质目的就是为了管理Bean,对于Bean而言,在容器中存在其生命周期,它的初始化和销毁也需要一个过程,下面主要对其生命周期进行一个详解的解释.生命周期主要是为了了解Spring IoC容器初始化和销毁Bean的过程,通过下图即可以掌握Spring IoC容器初始化与销毁Bean的过程. 通过上图,我们首先可以看到生命周期的步骤. 1)如果Bean实现了接口 BeanNameAware 的 setBeanName 方法,那么它就会调

Spring Framework核心概念之Bean生命周期管理

目录 Spring Bean的生命周期 相关接口的分类 测试SpringBean生命周期的Demo程序 小结 Spring Bean的生命周期 Spring容器既Application或者WebApplication会在管理Bean的时候:为了尽可能的把自己内部的东西机制暴露出来给用户使用,所以在Bean创建的过程中加了很多机制,通过所谓的"处理器"Processor暴露出来,然后处理器都有自己的顺序,我们需要做的就是定义好处理器的逻辑,然后注册到Sprinhg容器中,Spring就会

初探Spring源码之Spring Bean的生命周期

写在前面的话: 学无止境,写博客纯粹是一种乐趣而已,把自己理解的东西分享出去,不意味全是对的,欢迎指正! Spring 容器初始化过程做了什么? 1 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); 实例了一个 AnnotationConfigApplicationContext对象,Spring中出来注解Bean定义的类有两个: Annotation

spring源码 AutowireCapableBeanFactory接口

对于想要拥有自动装配能力,并且想把这种能力暴露给外部引用的BeanFactory类需要实现此接口.正常情况下,不要使用此接口应该更倾向于使用BeanFactory或者ListableBeanFactory接口. /* * Copyright 2002-2016 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not

Java Servlet系列之Servlet生命周期

Servlet生命周期定义了一个Servlet如何被加载.初始化,以及它怎样接收请求.响应请求,提供服务.在讨论Servlet生命周期之前,先让我们来看一下这几个方法: 1. init()方法 在Servlet的生命周期中,仅执行一次init()方法,它是在服务器装入Servlet时执行的,可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(): 2. service()方法 它是Servlet的核心,每当