037Bean处理器

所谓的bean处理器是指对容器中所有的bean进行处理,得到一个增强的bean

bean处理器是一个实现了BeanPostProcessor接口的bean。

BeanPostProcessor接口中有如下两个default方法可以重写

  • Object postProcessBeforeInitialization(Object bean, String beanName)
    在bean初始化之前对bean处理的方法

  • Object postProcessAfterInitialization(Object bean, String beanName)
    在bean刚初始化之后对bean处理的方法

示例:(修改Dog示例的成员变量)
为了演示bean处理器触发时机,在Dog类中添加了生命周期方法

public class Dog implements InitializingBean
{
    private String name;
    private String color;

    public void born()
    {
        System.out.println("--------------Dog初始化完成:调用方法born--------------");
    }

    @Override
    public void afterPropertiesSet() throws Exception
    {
        System.out.println("--------------Dog初始化完成:调用方法afterPropertiesSet--------------");
    }
    //省略getter、setter方法
}


public class LiveProcesses implements BeanPostProcessor
{
    //bean初始化前处理器
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException
    {
        if (bean instanceof Dog)
        {
            try {
                Class clazz = bean.getClass();
                Field f = clazz.getDeclaredField("name");
                f.setAccessible(true);
                f.set(bean,"【bean初始化前处理器增加的前缀】" + f.get(bean));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return bean;
    }
     //bean初始化后处理器
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException
    {
        if (bean instanceof Dog)
        {
            try {
                Class clazz = bean.getClass();
                Field f = clazz.getDeclaredField("color");
                f.setAccessible(true);
                f.set(bean,"【bean初始化后处理器增加的前缀】" + f.get(bean));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return bean;
    }
}

	<!--注册bean处理器-->
  <bean class="com.lyx.factory.LiveProcesses" />
  
  <bean id="dog" class="com.lyx.service.Dog" init-method="born"
        p:name="点点" 
        p:color="黑白相间"/>

驱动程序

public class Driver
{
    public static void main(String[] args)
    {
        var ctx = new ClassPathXmlApplicationContext("beans.xml");
        var dog = (Dog)ctx.getBean("dog");
        var name = dog.getName();
        System.out.println("name = " + name);
        var color = dog.getColor();
        System.out.println("color = " + color);
        //输出:
        //--------------初始化完成:调用方法afterPropertiesSet--------------
        //--------------初始化完成:调用方法born--------------
        //name = 【bean初始化前处理器增加的前缀】点点
        //color = 【bean初始化后处理器增加的前缀】黑白相间
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值