Spring的BeanFactory后处理器

Spring框架包含两种后处理器:Bean工厂后处理器在BeanDefinitionMap构建完成后、实例化之前执行,可用于修改BeanDefinition或注册新Bean;Bean后处理器在Bean实例化后、加入单例池之前执行,可干预Bean初始化。通过这两个处理器,可以实现对Bean生命周期的定制,如设置Bean属性、注册额外的Bean等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring后处理器

概念

Spring的两种后处理器包括:

  1. Bean工厂后处理器,在BeanDefinitionMap填充完毕后,Bean实例化之前执行;
  2. Bean后处理器:在Bean实例化后,添加到singletonObjects走之前执行;

Spring的Bean工厂处理器

快速入门


public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("beanDefinitionMap 填充完毕后回调postProcessBeanFactory");

        // 修改某个BeanDefinition
        // 获取BeanDefinitionMap红得到userService对象的Definition
        BeanDefinition beanDefinition = configurableListableBeanFactory.getBeanDefinition("userService");
        // 强行将这个beanDefinition修改为com.itheima.dao.impl.UserDaoImpl,在后面获取究竟会变成com.itheima.dao.impl.UserDaoImpl
        beanDefinition.setBeanClassName("com.itheima.dao.impl.UserDaoImpl");

    }
}
public static void main(String[] args) {

    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 通过beanname进行获取 这里因为在Bean工厂后处理器中对Definition进行了强制修改,所以这边放回的是UserDaoImpl
    Object userService = applicationContext.getBean("userService");
    System.out.println(userService);

    applicationContext.close();
}

通过后处理器注册BeanDefinition1

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
        System.out.println("beanDefinitionMap 填充完毕后回调postProcessBeanFactory");

        // 通过后处理器直接将类注册进Spring中
        BeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.itheima.dao.impl.PersonDaoImple");
        // 强转成DefaultListableBeanFactory, 其功能比ConfigurableListableBeanFactory更强大
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableListableBeanFactory;
        // 进行实际的注册
        defaultListableBeanFactory.registerBeanDefinition("personDao", beanDefinition);

    }
}
public static void main(String[] args) {

    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    // 通过beanname进行获取
    Object userService = applicationContext.getBean("personDao");

    System.out.println(userService);
    applicationContext.close();
}

通过后处理器注册BeanDefinition1

通过继承BeanDefinitionRefistryPostPorcesser更方便的实现后处理器注册BeanDefinition

public class BeanDefinitionRegistryPostProcessor implements org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor {
    // 先执行
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        // 注册BeanDefinition
        BeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.itheima.dao.impl.PersonDaoImple");
        beanDefinitionRegistry.registerBeanDefinition("personDao", beanDefinition);
    }

    // 后执行
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}

注解方式注册Bean

  1. 通过@MyComponent对需要进行注册的类进行标注
  2. 使用扫描工具找到所有带有标签的类
  3. 使用后处理器为每个类注册

Bean后处理器

Bean后处理器,是在Bean被实例化后存储到singletonObject单例池之前,会进行相应的处理,中间会经过Bean的初始化过程,例如属性填充,init等执行,其中一个就是Bean后处理器

快速入门

public class MyBeanPostProcessor implements BeanPostProcessor {
    // 写了这个以后所有的Bean创建都会经过这个
    // 先执行 在Bean实例化后的第一步,中间包括set方法、afterPropertiesSet、init方法
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof UserDaoImpl){
            UserDaoImpl userDao = (UserDaoImpl) bean;
            userDao.setUsername("123123123132");
        }
        System.out.println(beanName+":postProcessBeforeInitializaiton");
        return bean;
    }

    // 后执行 在Bean实例化后的最后一步
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+":postProcessAfterInitialization");
        return bean;
    }
}

before和after执行的顺序

  1. postProcessBeforeInitialization
  2. Setxxx方法
  3. afterOrioertueSet方法
  4. init-method方法
  5. postProcessAfterInitialization方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值