马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
前言
本篇博客 ,重要先容 bean的处理惩罚器。可以结合,详解 bean 对象的生命周期 和实例化对象的详细过程-CSDN博客
一起明白学习。
相识 实例化对象的详细过程
- 加载 spring.xml文件将bean 标签 ,封装成BeanDefinition
- 将这些BeanDefinition存放到BeanDefinitionMap内
- 遍历Map,得到Bean
- 将Bean存放到singletonObjects(单例池)
- 通过调用getBean方法得到bean
底层代码细节,同样可以参照 详解 bean 对象的生命周期 和实例化对象的详细过程-CSDN博客
bean 的处理惩罚器
概念:使用 bean 处理惩罚器,可以人为的干预 bean 实例化过程详细包括 动态添加、修改BeanDefinition,动态参与 bean 生命周期。
spring 重要有两者处理惩罚器 :一种是Bean工厂后处理惩罚器,另一种是Bean后处理惩罚器
根据作用 机遇可以区别为:
Bean 工厂 后处理惩罚器 是在 遍历 beanDefinationMap 之前
Bean 后处理惩罚器 是在 遍历 beanDefinationMap 之后,调用 getBean 方法从 单例池 拿到 bean 之前。
根据用途可以区分为:
Bean工厂后处理惩罚器:使用 bean 后处理惩罚器可以人为的干预 bean 的创建进程
Bean 后处理惩罚器:使用 bean 后处理惩罚器可以人为的干预 bean 的生命周期
Bean工厂后处理惩罚器(BeanFactoryPostProcessor)
BeanFactoryPostProcessor是一个接口规范,实现该接口的类只需交给Spring容器管理,spring就会调用该接口的方法;
验证 使用 bean 后处理惩罚器可以人为的干预 bean 的创建进程
1 可以动态修改 BeanDefinition
demo 案例
目的; 表面上创建 Agg 对象,但实际上打印的是Hen类对象,使用Bean工厂后处理惩罚器 实现偷梁换柱的效果
spring 配置文件
- <!-- Bean 工厂后处理器-->
- <bean class="fs.BFFP" id="bffp"></bean>
- <bean class="fs.Hen" id="hen"></bean>
- <bean class="fs.Agg" id="agg"></bean>
复制代码 Bean 工厂后处理惩罚器的接口实现类:BFFP
- package fs;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanDefinition;
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- public class BFFP implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
- BeanDefinition hen = BeanFactory.getBeanDefinition("agg");
- hen.setBeanClassName("fs.Hen");
- }
- }
复制代码 测试效果
2 动态注册beanDefinition
原本创建对象的模式都是依靠 spring 配置文件 ,写成一个个bean 标签,交给 spring 容器 管理。但现在 我们不再依托 spring 配置文件,而是手动把 目的类注入 进 容器中,实现创建对象
操纵步调
- 创建一个beanDefinition对象(new RootBeanDefiniton())
- 用该对象设置类的全限定名(路径)
- 动态注册到BeanDefinitionMap中 (DefaultListableBeanFactory)
demo 案例
目的: 手动 将 person 类 交给 spring 容器
Bean 工厂后处理惩罚器的接口实现类:BFFP
- package fs;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- import org.springframework.beans.factory.support.DefaultListableBeanFactory;
- import org.springframework.beans.factory.support.RootBeanDefinition;
- public class BFFP implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
- RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
- rootBeanDefinition.setBeanClassName("fs.Person");
- DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) BeanFactory;
- defaultListableBeanFactory.registerBeanDefinition("person", rootBeanDefinition);
- }
- }
复制代码 spring 配置文件
- <bean class="fs2.MyBp" id="myBp"></bean>
- <bean class="fs2.Student" id="student" >
复制代码 测试效果
Bean后处理惩罚器(BeanPostProcessor)
Bean后处理惩罚器也是一个接口,但是它的实行时间是对象创建之后,实现该接口必要重写两个方法,分别在bean的初始化前和初始化后实行:
验证 bean 后处理惩罚器可以人为的干预 bean 的生命周期
demo案例
目的:使用 teacher 类 和 student 类 演示 它们各自的使用 bean 后处理惩罚器的场景
spring 配置文件
- <bean class="fs2.MyBp" id="myBp"></bean>
- <bean class="fs2.Student" id="student" init-method="ins">
- </bean>
- <bean class="fs2.Teacher" id="teacher" init-method="ins">
复制代码 之后的 teacher 类 和 student 类 都各自重写 ins 初始化方法
- MyBp 类是BeanPostProcessor 的实现类
复制代码- package fs2;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanPostProcessor;
- public class MyBp implements BeanPostProcessor {
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- // 初始化后
- System.out.println("AfterInitialization 啦啦啦被执行了。。。。");
- return bean;
- }
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- // 初始化前
- System.out.println("BeforeInitialization 啦啦啦被执行了。。。。");
- return bean;
- }
- }
复制代码 Test 测试类
发现:可以看到实行顺序为 postProcessBeforeInitialization -> 对象初始化方法 -> postProcessAfterInitialization
现在补充 bean 实例化对象的样图
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |