BeanPostProcessor(后处理器)的简单使用

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类

  1. public class User {
  2. private String name;
  3. private String password;
  4. private int age;
  5. //省略setter 和 getter
  6. }

2 在springContext.xml文件中将User注册为一个bean并设置相应的属性。

  1. <bean id= "user" class= "com.zsq.cn.login.entity.User">
  2. <property name= "name" value= "zsq" />
  3. <property name= "age" value= "22" />
  4. <property name= "password" value= "001" />
  5. </bean>

3 新建一个后处理器 其实现两个接口 一个是BeanPostProcessor一个是Ordered,并通过@Component注解将该类注入容器

  1. @Component
  2. public class TestBeanPostProcessor implements BeanPostProcessor,Ordered{
  3. @Override
  4. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  5. return bean;
  6. }
  7. @Override
  8. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  9. if(bean instanceof User){
  10. User user = (User) bean;
  11. user.setName( "zhaosongqiang");
  12. }
  13. return bean;
  14. }
  15. @Override
  16. public int getOrder() {
  17. return 0;
  18. }
  19. }

4 新建一个controller 来依赖获取user bean的实例

  1. @Controller
  2. public class LoginController extends BaseException{
  3. @Autowired
  4. private User user;
  5. @RequestMapping( "/")
  6. public String home(Model model){
  7. System.out.println(user.toString());
  8. return "home/index";
  9. }
  10. }
控制台的输出结果为:[name=zhaosongqiang,password=001,age=22]

 可以看到在后处理器里已经改变了bean.

当然可以,以下是一个简单的例子: ```java import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; public class MyBeanPostProcessor implements BeanPostProcessor { public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("Before initialization of bean " + beanName); return bean; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("After initialization of bean " + beanName); return bean; } } ``` 在这个例子中,我们定义了一个名为 MyBeanPostProcessor 的类,它实现了 BeanPostProcessor 接口。这个接口有两个方法:postProcessBeforeInitialization 和 postProcessAfterInitialization,它们分别在 bean 初始化之前和之后被调用。 我们可以在这两个方法中添加我们自己的逻辑,比如在 postProcessBeforeInitialization 中打印出 bean 的名称,或者在 postProcessAfterInitialization 中对 bean 进行一些修改。 要在 Spring 中使用这个后置处理器,我们需要在配置文件中将它声明为一个 bean: ```xml <bean id="myBeanPostProcessor" class="com.example.MyBeanPostProcessor"/> ``` 然后,我们可以将它应用到我们需要处理的 bean 上: ```xml <bean id="myBean" class="com.example.MyBean" init-method="init"> <property name="name" value="John"/> <property name="age" value="30"/> <property name="address" value="123 Main St."/> <property name="phone" value="555-1234"/> <property name="email" value="john@example.com"/> <property name="salary" value="50000"/> <property name="bonus" value="10000"/> <property name="taxes" value="15000"/> <property name="netSalary" value="45000"/> </bean> <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> <property name="propertyOverrides"> <props> <prop key="myBean.salary">60000</prop> <prop key="myBean.bonus">12000</prop> <prop key="myBean.taxes">18000</prop> <prop key="myBean.netSalary">54000</prop> </props> </property> </bean> ``` 在这个例子中,我们定义了一个名为 myBean 的 bean,并将它的属性值设置为一些默认值。然后,我们使用 PropertyOverrideConfigurer 将一些属性值覆盖为新的值。 当我们运行这个应用程序时,我们会看到 MyBeanPostProcessor 的两个方法被调用了两次,分别在 myBean 初始化之前和之后。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值