BeanPostProcessor 的使用,实现在对象初始化之前或者之后对对象进行操作

import java.lang.reflect.Field;

import org.springframework.beans.BeansException;

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

public class UpperCaseModifier implements BeanPostProcessor {

@Override

public Object postProcessAfterInitialization(Object bean, String name)

throws BeansException {

// TODO Auto-generated method stub

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

return bean;

}

@Override

public Object postProcessBeforeInitialization(Object bean, String name)

throws BeansException {

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

// 取 bean 所有属性

Field[] fields = bean.getClass().getDeclaredFields();

for (int i=0; i<fields.length; i++) {

//判断 name 字段

if (fields[i].getName().equals("name")) {

//设置该字段可访问

fields[i].setAccessible(true);

try {

String original = (String) fields[i].get(bean);

System.out.println(original);

fields[i].set(bean, original.toUpperCase());

} catch (Exception e) {

e.printStackTrace();

}

}

}

return bean;

}

}



以上代码实现将 name 属性值中的小写字母转变为大写字母;


BeanPostProcessor 接口包括两个方法:

postProcessAfterInitialization:在实例化之后进行操作

postProcessBeforeInitialization:在实例化之前进行操作


要在配置文件中引入该类

<bean id="upperCaseModifier" class="UpperCaseModifier"></bean>



渣渣就得在 Bug 中挣扎

来自为知笔记(Wiz)

时间: 2024-10-31 15:29:45

BeanPostProcessor 的使用,实现在对象初始化之前或者之后对对象进行操作的相关文章

理解隐式类型、对象初始化程序和匿名类型

在C# 3.0中,几乎每个新特性都是为LINQ服务的.所以,本文将介绍下面几个在C# 3.0中引入的新特性: 自动实现的属性 隐式类型的局部变量 对象和集合初始化程序 隐式类型的数组 匿名类型 其实这几个特性都是比较容易理解的,对于这几个特性,编译器帮我们做了更多的事情(想想匿名方法和迭代器块),从而简化我们的代码. 自动实现的属性 在C# 3.0以前,当我们定义属性的时候,一般使用下面的代码 public class Book { private int _id; private string

C++中对象初始化

在C++中对象要在使用前初始化,永远在使用对象之前先将它初始化. 1.对于无任何成员的内置类型,必须手工完成此事. 例如: int x=0; double d; std::cin>>d; 2.内置对象以外的东西,初始化责任落在构造函数身上.确保每一个构造函数都将对象的每一个成员初始化. 例如: class Point {......}; class Point3d { public: Point3d(Point pt,int z); private:                   Poi

对象初始化

对象初始化过程 第一步:在创建之前,检查是否加载(检查硬盘上的class文件是否加载到内存中,如果没有加载,就先加载父类的文件) 在加载父类的文件,在加载本类的文件中java使用的加载的策略:懒惰式加载(按需加载)用到的时候,只加载一次. 第二步:分配对象的空间.递归分配所有父类和子类的属性空间,属性会自动初始化为"0"的值 第三步:给属性赋值 第四步:调用父类的构造方法(默认调用父类的无参构造方法) 第五步:调用本类的构造方法

类加载与对象初始化

1. 初始化原因:避免发生空指向异常. 2. 类加载与初始化的顺序: 2.1 类加载时间:          每个类的编译代码都存在于他自己的独立文件中,该文件的加载通常发生在创建类的第一个对象时,或是访问类的static域或static方法时. 2.2 初始化顺序:(先父类后子类,创建对象之前先对类中的域进行初始化)        首先,类加载器主动加载主类(主类的初始化顺序与下面普通类一样),找到main方法,在main方法中根据第一行要创建的对象,加载该类的字节码文件,如果编译器注意到她有

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

Java 对象初始化顺序 执行顺序

先看一道Java面试题: 求这段程序的输出. 解答此题关键在于理解和掌握类的加载过程以及子类继承父类后,重写方法的调用问题: 从程序的执行顺序去解答: 1.编译:当这个类被编译通知后,会在相应的目录下生成两个.class 文件.一个是 Base.class,另外一个就是Base$Sub.class.这个时候类加载器将这两个.class  文件加载到内存 2.Base base= new Sub(): 声明父类变量base对子类的引用,JAVA类加载器将Base,Sub类加载到JVM(Java虚拟

对象初始化的过程

对象初始化过程: a.在创建类之前,检查类是否已加载(检查硬盘上的class文件,是否已加载到内存中),如果没有加载就先加载父类文件,再加载本类的文件        Java使用的加载策略:懒惰式加载(按需要加载),用到的时候加载,只加载一次 b.分配对象的空间,递归分配所有的父类和子类的属性空间  属性会自动初始化为"0"值 c.给属性赋值 d.调用父类的构造方法(默认调用父类的无参构造方法) e.调用本类的构造方法

对象初始化优先级

初始化优先级:静态代码块>>main方法>>构造代码块>>构造函数 1 package com.itinfo; 2 3 /** 4 * 代码块的优先级 5 * http://www.cnblogs.com/goodcheap 6 * 7 * @author: Wáng Chéng Dá 8 * @create: 2017-02-26 19:12 9 */ 10 public class CodeBlock { 11 12 static { 13 System.out.p

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父