六、Spring后处理器

六、Spring后处理器

  • Spring的后处理器是Spring对外开放的重要扩展点,允许我们介入到Bean的实例化流程中,以达到动态注册BeanDefinition,动态修改BeanDefinition,以及修改Bean的作用,主要有两种后处理器:
    • BeanFactoryPostProcessor:Bean工厂后处理器,在BeanDefinitionMap填充完毕Bean实例化之前执行
    • BeanPostProcessor:Bean后处理器,一般在Bean实例化后填充到单例池singletonObjects之前执行

6.1 工厂后处理器 BeanFactoryPostProcessor

6.1.1 修改BeanDefinition

public class MyBeanFactoryProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        // 修改beanDefinition
        BeanDefinition userService = beanFactory.getBeanDefinition("userService");
        userService.setBeanClassName("xxx.UserDaoImpl");
    }
}

@Test
public void test() {
        // 创建ApplicationContext,加载xml文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 获取bean
        Object userService = applicationContext.getBean("userService");
        System.out.println(userService);
}
<bean id = "userDao" class = "xxx.UserDaoImpl"></bean>

<bean id="userService" class="xxx.UserServiceImpl"></bean>

<!-- bean 后工厂处理 -->
<bean class="xxx.MyBeanFactoryProcessor"></bean>

getBean之前:

在这里插入图片描述

在这里插入图片描述

getBean之后:

在这里插入图片描述

6.1.2 注册BeanDefinition

<!-- 没有bean实例 -->
<bean class="xxx.MyBeanFactoryProcessor"></bean>
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    // 注册beanDefinition
    BeanDefinition beanDefinition = new RootBeanDefinition();
    beanDefinition.setBeanClassName("xxx.UserServiceImpl");
    DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
    // beanName beanDefinition
    defaultListableBeanFactory.registerBeanDefinition("userService", beanDefinition);
}

6.1.3 BeanDefinitionRegistryPostProcessor

  • 是BeanFactoryPostProcessor的子接口,专门用来注册BeanDefinition
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
        // 注册beanDefinition
        BeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClassName("xxx.UserServiceImpl");
        beanDefinitionRegistry.registerBeanDefinition("userService1", beanDefinition);
    }

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {

    }
}
<bean class="xxx.MyBeanDefinitionRegistryPostProcessor"></bean>

在这里插入图片描述

6.2 Bean后处理器 BeanPostProcessor

public class MyBeanPostProcessor implements BeanPostProcessor {

    /**
    * 实例化、依赖注入完毕,在调用显示的初始化之前完成一些定制的初始化任务
    * 方法返回值不能为null,返回null表示后处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
    * 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象
    */
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization-----before")
        return bean;
    }

    /**
    * 实例化、依赖注入、初始化完毕时执行 
    * 方法返回值不能为null,返回null表示后处理器从Spring IoC容器中取出bean实例对象没有再次放回IoC容器中
    * 如果返回null那么在后续初始化方法将报空指针异常或者通过getBean()方法获取不到bena实例对象
    */
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization-----after")
        return bean;
    }
}
public class User {
	private String name;
	public User(){System.out.println("User 被实例化");}
	// 自定义的初始化方法
	public void start(){System.out.println("User 中自定义的初始化方法");}
}
<bean class="xxx.User" id="user" init-method="start">
		<property name="name" value="迪迦奥特曼" />
</bean>
	
<!-- 注册处理器 -->
<bean class="xxx.MyBeanPostProcessor"></bean>
执行结果:
User 被实例化
迪迦奥特曼
postProcessBeforeInitialization-----before
User 中自定义的初始化方法
postProcessAfterInitialization-----after


执行顺序:
Bean实例化 -> Bean属性注入 -> postProcessBeforeInitialization -> init-method(自定义初始化方法) -> postProcessAfterInitialization
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值