Spring创建bean是根据配置来的,你可以通过xml文件配置,也可以通过java 的方式来配置,Spring在IOC容器完成bean的实例化、配置和初始化后可以通过BeanPostProcessor(后处理器)对创建的bean进行各种处理。你可以在这里修改bean的属性或者增强bean,spring AOP创建jdk代理或者cglib代理的过程就是在BeanPostProcessor(后处理器)中实现的。因此我将Spring AOP 技术看做是:Spring AOP = BeanPostProcessor + 代理。
BeanPostProcessor的作用域范围是容器级的。它只和你所使用的容器有关。如果你在容器中定义一个实现了BeanPostProcessor的类,它仅仅对此容器中的bean进行后置处理。
如果配置了多个BeanPostProcessor,那么可以通过实现Ordered接口设置'order'属性来控制BeanPostProcessor的执行次序。
下面我们来实现一个很简单的例子。我会在一个Controller中注入一个singleton 作用域的User bean实例,我会在xml中配置好user的name属性为“”zsq“”,然后我会通过后处理器将user的name属性更改为“”zhaosongqiang“”。
1 首先创建一个User类
-
public class User {
-
-
private String name;
-
-
private String password;
-
-
private int age;
-
//省略setter 和 getter
-
}
2 在springContext.xml文件中将User注册为一个bean并设置相应的属性。
-
<bean id= "user" class= "com.zsq.cn.login.entity.User">
-
<property name= "name" value= "zsq" />
-
<property name= "age" value= "22" />
-
<property name= "password" value= "001" />
-
</bean>
3 新建一个后处理器 其实现两个接口 一个是BeanPostProcessor一个是Ordered,并通过@Component注解将该类注入容器
-
-
public class TestBeanPostProcessor implements BeanPostProcessor,Ordered{
-
-
-
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
-
return bean;
-
}
-
-
-
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
-
if(bean instanceof User){
-
User user = (User) bean;
-
user.setName( "zhaosongqiang");
-
}
-
return bean;
-
}
-
-
-
public int getOrder() {
-
return 0;
-
}
-
}
4 新建一个controller 来依赖获取user bean的实例
-
-
public class LoginController extends BaseException{
-
-
-
private User user;
-
-
"/")(
-
public String home(Model model){
-
-
System.out.println(user.toString());
-
-
return "home/index";
-
}
-
}
可以看到在后处理器里已经改变了bean.