Spring BeanPostProcessors

时间:2020-02-23 14:35:41  来源:igfitidea点击:

BeanPostProcessors接口提供了方法,我们可以实现自己的实例化逻辑。
通过插入一个或者多个BeanPostProcessor实现,我们可以在Spring IoC结束后写下自己的逻辑。

我们可以配置多个 BeanPostProcessors并且还可以通过设置订单属性来决定它们将相互运行的顺序,但是 BeanPostProcessors必须实施有序接口。

的扩展 BeanPostProcessorBeanFactoryPostProcessor接口允许在实例化bean之前直接修改bean定义

一个 ApplicationContext将自动注册和处理实现这些接口中的任一个的bean,但是a BeanFactory必须有一个 BeanPostProcessor或者 BeanFactoryPostProcessor以编程方式注册。

Spring例子中的BeanPostProcessors:

1.Country.java.

这是一个简单的pojo类,其中一些属性所以这里的国家有名字。

在package org.arpit.javapostssforlarearning中创建country.java .Copy内容到Country.java之后。

package org.arpit.javapostsforlearning;
 
public class Country {
 
	String countryName ;
 
	public String getCountryName() {
		return countryName;
	}
 
 
	public void setCountryName(String countryName) {
		this.countryName = countryName;
	}
 
	public void init()
	{
		System.out.println("In init block of country");
	}
 
	public void destroy()
	{
		System.out.println("In destroy block of country");
	}
}

2.InitcapitalPostProcessor.java </h2>这是简单的pojo类,实现beanpost processor接口。

在package org.arpit.javapostsfor learning中创建initcapitalpostprocessor.java .Copy在内容中进入initcapitalPostProcessor.java之后。

package org.arpit.javapostsforlearning;
 
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
 
public class InitCapitalPostProcessor implements BeanPostProcessor{
 
	public Object postProcessAfterInitialization(Object bean, String beanName)
			throws BeansException {
		System.out.println("AfterInitialization : " + beanName);
		return bean;  //you can return any other object as well
	}
 
	public Object postProcessBeforeInitialization(Object bean, String beanName)
			throws BeansException {
 
		System.out.println("BeforeInitialization : " + beanName);
		return bean;  //you can return any other object as well
	}
 
}

其中我们正在编写非常简单的逻辑,但我们可以在上面的函数中编写相当复杂的逻辑。我们可以注意到我们在这里有Bean类的对象,以便以任何我们想要的方式更改,并且可以返回相同或者不同的对象。

3.PplicationContext.xml.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
 <bean id="country" class="org.arpit.javapostsforlearning.Country" init-method="init" destroy-method="destroy">
 <property name="countryName" value="San Franceco"
 </bean>
      <bean class="org.arpit.javapostsforlearning.InitCapitalPostProcessor" 
 </beans>

4.BeanPostProcessoreXamplemain.java.

此类包含main function.Create BeanPostProcessoreXamplemain.java在package org.arpit.javapostsforlearning .copy之后的内容到beanpostprocessorexamplemain.java之后

package org.arpit.javapostsforlearning;
 
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class BeanPostProcessorExampleMain{
 
	public static void main(String[] args) {
 
		AbstractApplicationContext appContext = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		Country countryObj = (Country) appContext.getBean("country");
		System.out.println("Country Name: "+countryObj.getCountryName());
		appContext.registerShutdownHook();
	}
}

其中我们需要注册在抽象应用程序上声明的关机钩注册器HUTDOWNHOOK()方法。
这将确保优雅的关机并调用相关的Destroy方法。

5.运行

当我们将运行上面的应用程序时,我们将按照输出作为输出。

BeforeInitialization : country
In init block of country
AfterInitialization : country
Country Name: San Franceco
In destroy block of country