好玩Spring之BeanPostProcessor及InstantiationAwareBeanPostProcessor接口

在之前我们看bean的生命周期时,有如下过程。

好玩Spring之BeanPostProcessor及InstantiationAwareBeanPostProcessor接口_第1张图片 

在实例化前后,有InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation和InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation两个动作。

InstantiationAwareBeanPostProcessor作用:它继承于BeanPostProcessor,2个接口十分相似,只是执行的阶段不同。

好玩Spring之BeanPostProcessor及InstantiationAwareBeanPostProcessor接口_第2张图片

在bean的初始化前后,有BeanPostProcessor.postProcessBeforeInitialization和BeanPostProcessor.postProcessAfterInitialization2个动作。

BeanPostProcessor作用:在bean的初始化前后,添加自己的一些处理逻辑。例如改变bean的属性等,如下。

// xml配置

	


// Java代码
public static void main(String[] args) {
		ApplicationContext context = new FileSystemXmlApplicationContext("C:\\beanPostProcessor\\chapter1\\person.xml");
		Person person = (Person) context.getBean("person");
		System.out.println(person.getName());
	}

// 结果
打印了 HaHa

如何是打印了HaHa,而不是Hi。

因为注册了一个BeanPostProcessor,来修改初始化前后bean的属性。

public class MyBeanPostProcessor implements BeanPostProcessor {
	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
		System.out.println("postProcessBeforeInitialization:: "+beanName);
		if("person".equals(beanName)) {
			Class clazz = bean.getClass();
			try {
				Field nameField = clazz.getDeclaredField("name");
				nameField.setAccessible(true);
				nameField.set(bean, "HaHa");
			} catch (NoSuchFieldException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return bean;
	}

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

 

你可能感兴趣的:(java,spring)