06-Spring-IOC-后置处理器

starrylsi
2024-09-11 / 0 评论 / 20 阅读 / 正在检测是否收录...

理论:Spring Bean后处理器是Spring框架提供的一种扩展机制,划重点:扩展机制。用于在Spring容器实例化、配置和初始化Bean的过程中,添加自定义逻辑。(大白话:后处理器是可以在Bean的生命周期的不同阶段 进行干预,可以对Bean进行修改、增强或者执行其他操作。开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例化的一个过程)

后置处理器:原文链接

spring后置处理器.png

//创建一个AI接口

public interface AI {

    public void show();
    
}
//修改A类实现AI接口

public class A implements AI {

    public A() {
        System.out.println("这是A对象被创建了");
    }

    public void initA() {
        System.out.println("这里是初始化A的方法");
    }
    
    public void destroyA() {
        System.out.println("这里是销毁A的方法");
    }

    @Override
    public void show() {
        System.out.println("--这是目标A对象的show方法--");
    }
}

1、创建一个类去实现后置处理器的接口(top.starrylsi.handler)

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("这是初始化之前: bean->[" + bean + "] , beanName ->["
                + beanName + "]");

        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("这是初始化之后: bean->[" + bean + "] , beanName ->["
                + beanName + "]");

        if ("a".equals(beanName)) {
            // 创建一个jdk动态代理
            AI proxyAi = (AI) Proxy.newProxyInstance(bean.getClass()
                    .getClassLoader(), bean.getClass().getInterfaces(),
                    new InvocationHandler() {

                        @Override
                        public Object invoke(Object proxy, Method method,
                                Object[] args) throws Throwable {
                            System.out.println("这是前置增强代码");
                            Object result = method.invoke(bean, args);
                            System.out.println("这是后置增强代码");
                            return result;
                        }
                    });

            return proxyAi;
        } else {
            return bean;
        }

        // return bean;
    }

2、到Spring的配置文件中去配置后置处理器

     <!-- 
         init-method="initA"         设置初始化方法
         destroy-method="destroyA"    设置销毁的方法
      -->
    <bean id="a" class="com.zhuama.pojo.A" init-method="initA" destroy-method="destroyA"></bean>
    <!-- 配置Bean的后配置处理器。 -->
    <bean class="com.zhuama.util.MyBeanPostProcessor" />
测试的代码:

    @Test
    public void test24() {
        @SuppressWarnings("resource")
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(
                "application2.xml");
        AI ai = (AI) applicationContext.getBean("a");
        ai.show();
    }
0

评论 (0)

取消