spring 学习( 实例化对象的详细过程 bean的处理惩罚器) ...

王國慶  论坛元老 | 2025-2-14 15:20:13 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1053|帖子 1053|积分 3163

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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 配置文件
  1. <!--   Bean 工厂后处理器-->
  2.     <bean class="fs.BFFP" id="bffp"></bean>
  3.     <bean class="fs.Hen" id="hen"></bean>
  4.     <bean class="fs.Agg" id="agg"></bean>
复制代码
Bean 工厂后处理惩罚器的接口实现类:BFFP
  1. package fs;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.config.BeanDefinition;
  4. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  5. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  6. public class BFFP implements BeanFactoryPostProcessor {
  7.     @Override
  8.     public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
  9.         BeanDefinition hen = BeanFactory.getBeanDefinition("agg");
  10.         hen.setBeanClassName("fs.Hen");
  11.     }
  12. }
复制代码
测试效果
2 动态注册beanDefinition 


原本创建对象的模式都是依靠 spring 配置文件 ,写成一个个bean 标签,交给 spring 容器 管理。但现在 我们不再依托 spring 配置文件,而是手动把 目的类注入 进 容器中,实现创建对象
操纵步调
   

  • 创建一个beanDefinition对象(new RootBeanDefiniton())
  • 用该对象设置类的全限定名(路径)
  • 动态注册到BeanDefinitionMap中  (DefaultListableBeanFactory) 
  demo 案例
   目的: 手动 将 person 类 交给 spring 容器
  Bean 工厂后处理惩罚器的接口实现类:BFFP
  1. package fs;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  4. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  5. import org.springframework.beans.factory.support.DefaultListableBeanFactory;
  6. import org.springframework.beans.factory.support.RootBeanDefinition;
  7. public class BFFP implements BeanFactoryPostProcessor {
  8.     @Override
  9.     public void postProcessBeanFactory(ConfigurableListableBeanFactory BeanFactory) throws BeansException {
  10.         RootBeanDefinition rootBeanDefinition = new RootBeanDefinition();
  11.         rootBeanDefinition.setBeanClassName("fs.Person");
  12.         DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) BeanFactory;
  13.         defaultListableBeanFactory.registerBeanDefinition("person", rootBeanDefinition);
  14.     }
  15. }
复制代码
spring 配置文件
  1.     <bean class="fs2.MyBp" id="myBp"></bean>
  2.     <bean class="fs2.Student" id="student" >
复制代码
测试效果

Bean后处理惩罚器(BeanPostProcessor)

 Bean后处理惩罚器也是一个接口,但是它的实行时间是对象创建之后,实现该接口必要重写两个方法,分别在bean的初始化前和初始化后实行:
验证 bean 后处理惩罚器可以人为的干预 bean 的生命周期

demo案例
   目的:使用 teacher 类 和 student 类 演示 它们各自的使用 bean 后处理惩罚器的场景
  spring 配置文件
  1. <bean class="fs2.MyBp" id="myBp"></bean>
  2.     <bean class="fs2.Student" id="student" init-method="ins">
  3.     </bean>
  4.     <bean class="fs2.Teacher" id="teacher" init-method="ins">
复制代码
之后的  teacher 类 和 student 类 都各自重写 ins 初始化方法
  1. MyBp 类是BeanPostProcessor 的实现类
复制代码
  1. package fs2;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.config.BeanPostProcessor;
  4. public class MyBp implements BeanPostProcessor {
  5.     @Override
  6.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  7.         // 初始化后
  8.         System.out.println("AfterInitialization 啦啦啦被执行了。。。。");
  9.         return bean;
  10.     }
  11.     @Override
  12.     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  13.         // 初始化前
  14.         System.out.println("BeforeInitialization 啦啦啦被执行了。。。。");
  15.   return bean;
  16.     }
  17. }
复制代码
Test 测试类

   发现:可以看到实行顺序为 postProcessBeforeInitialization -> 对象初始化方法 -> postProcessAfterInitialization
  现在补充 bean 实例化对象的样图


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王國慶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表