Bean初始化之postProcessBeforeInitialization、afterPropertiesSet、init-method、postProcessAfterInitialization等方法的加载

一、简单介绍

1、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:<bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean>

这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。

2、afterPropertiesSet方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。afterPropertiesSet 必须实现 InitializingBean接口。实现 InitializingBean接口必须实现afterPropertiesSet方法。

3、BeanPostProcessor,针对所有Spring上下文中所有的bean,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。

总之,afterPropertiesSet 和init-method之间的执行顺序是afterPropertiesSet 先执行,init-method 后执行。从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,然后是init-method,然后是postProcessAfterInitialization。

二、相关用法及代码测试

1、PostProcessor类,实现BeanPostProcessor接口,实现接口中的postProcessBeforeInitialization,postProcessAfterInitialization方法

[java] view plaincopy

package nju.software.xkxt.util;

import org.springframework.beans.BeansException;

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

/**

* 定义Bean初始化前后的动作

*

* @author typ

*

*/

public class PostProcessor implements BeanPostProcessor {

@Override

public Object postProcessBeforeInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("------------------------------");

System.out.println("对象" + beanName + "开始实例化");

return bean;

}

@Override

public Object postProcessAfterInitialization(Object bean, String beanName)

throws BeansException {

System.out.println("对象" + beanName + "实例化完成");

System.out.println("------------------------------");

return bean;

}

}

该PostProcessor类要作为bean定义到applicationContext.xml中,如下

<bean class="nju.software.xkxt.util.PostProcessor"></bean>

2、TestBean类,用做测试Bean,观察该Bean初始化过程中上面4个方法执行的先后顺序和内容。实现InitializingBean接口,并且实现接口中的afterPropertiesSet方法。最后定义作为init-method的init方法。

package nju.software.xkxt.util;  

import org.springframework.beans.factory.InitializingBean;  

/**
 * 用做测试Bean,观察该Bean初始化过程中上面4个方法执行的先后顺序和内容
 *
 * @author typ
 *
 */
public class TestBean implements InitializingBean {
    String name;  

    public String getName() {
        return name;
    }  

    public void setName(String name) {
        this.name = name;
    }  

    public void init() {
        System.out.println("init-method is called");
        System.out.println("******************************");
    }  

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("******************************");
        System.out.println("afterPropertiesSet is called");
        System.out.println("******************************");
    }
}  

启动Tomcat服务器,可以看到服务器启动过程中,完成对Bean进行初始化。执行结果如下:

------------------------------

对象TestBean开始实例化

******************************

afterPropertiesSet is called

******************************

init-method is called

******************************

对象TestBean实例化完成

------------------------------

转自:写代码简单比较init-method,afterPropertiesSet和BeanPostProcessor - 综合编程类其他综合 - 红黑联盟

https://www.2cto.com/kf/201310/251778.html

时间: 2025-01-31 15:01:47

Bean初始化之postProcessBeforeInitialization、afterPropertiesSet、init-method、postProcessAfterInitialization等方法的加载的相关文章

Java 类的实例变量初始化的过程 静态块、非静态块、构造函数的加载顺序

Java 类的实例变量初始化的过程 静态块.非静态块.构造函数的加载顺序 先看一道Java面试题: 1 public class Baset { 2 private String baseName = "base"; 3 // 构造方法 4 public Baset() { 5 callName(); 6 } 7 // 成员方法 8 public void callName() { 9 // TODO Auto-generated method stub 10 System.out.p

Error 25007.初始化合成时发生错误。安装程序无法使用 LoadLibraryShim() 加载合成。

安装"Microsoft .NET Framework 2.exe"报错如下: c:\windows\microsoft.net\framework\...类似这种错误都因 .NET Framework受到损害.有一部分程序将无法使用.微软输入法也将瘫痪... ---------------------------Microsoft .NET Framework 2.0 安装程序---------------------------Error 25007.初始化合成时发生错误.安装程序

servlet的init()方法启动加载

<!DOCTYPE html> <html> <head> <title>about servlet init</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <style type="text/css"> /* GitHub stylesheet for 

类的加载、连接和初始化

系统可能在第一次使用某个类时加载该类,也可能采用预加载机制来加载某个类.本节将会详细介绍类加载.连接和初始化过程中的每个细节. JVM 和类 当调用 java 命令运行某个 Java 程序时,该命令将会启动一个 Java 虚拟机进程,不管该 Java 程序有多么复杂,该程序启动了多少个线程,它们都处于该 Java 虚拟机进程里.正如前面介绍的,同一个 JVM 的所有线程.所有变量都处于同一个进程里,它们都使用该 JVM 进程的内存区.当系统出现以下几种情况时,JVM 进程将被终止. 程序运行到最

spring源码阅读之Bean的加载(二)

在正式分析源码之前,先来了解一下SpringBeans里面最核心的两个类  DefaultListableBeanFactory XMLBean继承自 DefaultListableBeanFactory,而 DefaultListableBeanFactory是整个Bean加载的核心部分,是Sprin注册及加载Bean的默认实现,而对于XmlBeanFactory与 DefaultListableBeanFactory不同的地方其实就是在XmlBeanFactory中使用了自定义的XML读取器

JavaEE初始化时静态代码块加载问题

1.使用java.exe命令运行某个类的时java.exe Person2.创建一个类的对象时Person p=new Person();3.访问类中的静态成员变量(赋值/获取值)System.out.println(Person.className);4.访问了类中的静态成员方法Person.method();5.创建类的子类对象的时候Student s=new Student();6.使用反射方式来强制创建某个类或接口对应的java.lang.Class对象System.out.printl

Spring之IOC容器加载初始化的方式

引言 我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配置文件告诉Spring 的IOC容器.在我们的完成这些配置文件以后,如果IOC容易要实现对这些Bean的管理,除了资源的定位还有一个很重要的一步就是完成IOC加载初始化,也就是配置文件的载入过程.完成IOC容器加载初始化的方式只要有三种,第一种就是通过File文件加载,第二种是通过Classpath

【Spring源码分析】Bean加载流程概览

代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. 很多朋友可能想看Spring源码,但是不知道应当如何入手去看,这个可以理解:Java开发者通常从事的都是Java Web的工作,对于程序员来说,一个Web项目用到Spring,只是配置一下配置文件而已,Spring的加载过程相对是不太透明的,不太好去找加载的代码入口. 下面有很简单的一段代码可以作为Spring代码加载的入口: 1 ApplicationContext ac = new Clas

Spring源码学习-bean加载

1. 场景 一个applicationContext.xml配置文件,这个不可少一个bean,这里我没用接口,直接用一个普通的类做为Spring的bean一个Junit测试类 applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://w