BeanPostProcessor接口有两个方法,分别在bean的实例化前后做操作。有了它,我们可以很轻松的对bean做set动作,也可以返回一个完全不相关的bean。下面我来举个返回不相关bean的例子
首先我们可以建两个实体类(com.model包下)
User类
import java.io.Serializable;
@SuppressWarnings("serial")
public class User implements Serializable {
private static final long serialVersionUID = -2247281681931694200L;
private int id;
private String userName;
private String password;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
Log 类
public class Log implements Serializable{
private static final long serialVersionUID = -5378869442252807770L;
private int id;
private String Name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
}
这个是实现BeanPostProcessor接口的类(com.controller包下)
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.support.ApplicationObjectSupport;
import com.model.User;
//ApplicationObjectSupport是对上下文容器的管理,我们可以通过它去取bean
public class BeanName extends ApplicationObjectSupport implements
BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println(bean + "对象" + beanName + "实例化后要做的操作");
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println(beanName + "对象" + bean.getClass() + "前要做的操作");
if (beanName.equals("log")) {
User u;
u = (User) this.getApplicationContext().getBean("user");
u.setId(3);
return u;
}
return bean;
}
}
配置文件applicationContext.xml(classpath下)
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context <bean id="user" class="com.model.User"></bean> <bean id="log" class="com.model.Log"></bean> <bean class="com.controller.BeanName"></bean> </beans>
测试类
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import com.model.User;
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(ctx.getBean("dao").getClass().getName());
}
}
运行结果
user对象class com.model.User前要做的操作
com.model.User@16dadf9对象user实例化后要做的操作
log对象class com.model.Log前要做的操作
com.model.User@16dadf9对象log实例化后要做的操作
com.model.User
可以看出,我们已经成功的返回不相关bean对象User.
另外,我也测试过了,postProcessBeforeInitialization,postProcessAfterInitialization两个方法任写一个都可以实现对bean的更换以及操作。有兴趣的可以试一下。
转载于:https://blog.51cto.com/springxml/1416030