bean的后置处理器

bean的后置处理器


Spring框架中的后置处理器(PostProcessor)是一种特殊类型的Bean,用于在容器中的其他Bean实例化、组装和初始化过程中,对它们进行额外的处理操作。

在Spring的生命周期中,Bean的后置处理器接口包括两个主要方法:

postProcessBeforeInitialization(Object bean, String beanName):在Bean的初始化方法(如配置的init-method)被调用之前,对Bean进行自定义操作。该方法返回的对象将成为最终的Bean实例。

postProcessAfterInitialization(Object bean, String beanName):在Bean的初始化方法(如配置的init-method)被调用之后,对Bean进行自定义操作。该方法返回的对象将成为最终的Bean实例。

常见的Spring后置处理器包括:

BeanPostProcessor:提供通用的后置处理器功能,可以在Bean实例化、依赖注入和初始化的各个阶段对Bean进行自定义处理。
BeanFactoryPostProcessor:在容器实例化Bean之前,可以修改容器的Bean定义及其属性。通常用于修改配置元数据,如动态注入属性值等。
通过实现这些后置处理器接口,并将其注册到Spring容器中,我们可以实现各种自定义的逻辑,例如:为Bean动态注入属性、修改Bean的配置、执行额外的初始化逻辑等。
说了这么多,我们来举一个例子
首先,我们写一个类

public class Life {
    private String name;

    public Life() {
        System.out.println("Life的无参构造器");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("Life的set方法被调用");
        this.name = name;
    }
    public void init(){
        System.out.println("Life的初始化方法");
    }
    public void destroy(){
        System.out.println("Life的销毁方法");
    }
}

然后,配置这个类

<bean class="com.spring.Life" id="life"
          init-method="init" destroy-method="destroy">
        <property name="name" value="后置处理器"/>
    </bean>

然后再写一个类,通过继承BeanPostProcessor实现后置处理器

public class MyLife implements BeanPostProcessor {
    @Override
    //在bean的init方法前被调用
    //Object bean  在ioc容器中配置的bean
    //String beanName 在ioc容器中配置的id
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization" + bean);
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization" + bean);
        return null;
    }
}

重写postProcessAfterInitialization和postProcessBeforeInitialization方法
然后配置这个类

 <bean class="com.spring.test.MyLife" id="beanPostProcessor"/>

写一个测试看看结果

@Test
   public void beanPostProcessor(){
       //创建容器
       ApplicationContext ioc = new ClassPathXmlApplicationContext("beans02.xml");
       //得到对象
       Life life = ioc.getBean("life", Life.class);
       System.out.println("得到bean" + life);
       //关闭容器,因为ApplicationContext接口没有close方法,
       //强转为它的子接口,调用close方法
       ((ConfigurableApplicationContext)ioc).close();
   }

得到以下结果
在这里插入图片描述后置处理器针对的是容器内的所有对象,这里就引入了切面编程。

切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在增强面向对象编程(Object-Oriented Programming,OOP)的模块化和代码复用。

在传统的OOP中,我们通过将功能模块分解为各个对象来解耦和模块化代码。然而,随着业务的增长和变化,横切关注点(Cross-cutting Concerns)在不同模块中重复出现,如日志记录、事务管理、权限控制等。这导致代码的重复性和散乱性,并且难以维护和修改。

AOP的目标就是通过将这些横切关注点与核心业务逻辑分离,从而提高代码的可维护性和可重用性。在AOP中,我们将横切关注点定义为切面(Aspect),并将它们与应用程序的其他部分解耦。

切面是一个跨越多个对象的模块化单元,它定义了在目标对象的一组方法上执行的一系列的通用横切行为。这些通用行为通常称为切面的通知(Advice),包括“在方法执行前执行”、“在方法执行后执行”、“在方法抛出异常时执行”等。

AOP通过使用一种称为织入(Weaving)的技术,将切面的通知逻辑与核心业务逻辑进行组合,以创建最终运行时的对象。织入可以在编译时、加载时或运行时完成。

在Java中,Spring框架提供了强大的AOP支持。Spring AOP基于动态代理机制或字节码生成实现切面编程,开发者可以通过配置或注解的方式定义切面和通知,从而实现横切关注点的处理,而不需要修改核心业务代码。

总结来说,切面编程通过切面的定义和织入机制,将横切关注点从核心业务逻辑中剥离出来,提供一种更加模块化和可重用的方式来处理通用行为,以提高代码的可维护性和可重用性。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值