(2)Spring后置处理bean

原创
2020/07/27 22:27
阅读数 113

Spring后置处理bean

  • BeanPostProcessor作用:对Spring工厂所创建的对象,进行再加工。

  • Spring工厂创建对象过程图

    Spring工厂通过反射创建personBean 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("/ApplicationContext.xml");
    
    <bean id="person" class="com.spring.demo.converter.Person"/>
     		↓
     通过反射,调用实体的构造方法,创建实体类
            ↓
       InitializingBean初始化
            ↓
       init-method = "myinit" (调用自定义初始化方法)
      		↓
        ctx.getBean("person");   
    
    
  • 引入Spring后置处理Bean即引入BeanPostProcessor类,进行再加工。

    对比Spring工厂创建过程图可以发现,其主要区别在InitializingBean初始化的前后分别新增了,处理方法,即在正常流程中新增了前后处理步骤。

    流程图如下:

    <bean id="person" class="com.spring.demo.converter.Person"/>
     		↓
     通过反射,调用实体的构造方法,创建实体类
     		↓
     BeanPostProcessor前置处理
     Object postProcessBeforeInitializing(Object bean , String beanName){
     	//加工处理
     	return bean;
     }
            ↓
       InitializingBean初始化
       		↓
       BeanPostProcessor后置处理,bean为创建的Person对象,beanName为id="person"
    Object postProcessAfterInitializing(Object bean , String beanName){
     	//加工处理
     	//处理完毕之后 通过返回bean,再交由Spring继续处理
     	return bean;
     }
            ↓
       init-method = "myinit" (调用自定义初始化方法)
      		↓
        ctx.getBean("person");   
    
  • 编码,实现效果为,在Person对象创建之后,从新设置Person的Name值。

    • 新建类MyBeanPostProcess实现BeanPostProcessor接口,并在后置处理中从新设置Name为“你是猪”

      注意: 及时我们没有使用处理方法postProcessBeforeInitialization,但是也需要为其返回默认bean

      public class MyBeanPostProcess implements BeanPostProcessor {
      
          @Override
          public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
              return bean;
          }
      
          @Override
          public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
              if (bean instanceof Person) {
                  ((Person) bean).setName("你是猪");
              }
              return bean;
          }
      }
      
    • application.xml, 注册Person类,和myBeanPostProcessor类,交由Spring进行管理

          <!--注册Person类-->
          <bean id="person" class="com.spring.demo.converter.Person">
              <property name="name" value="sylvan" />
              <property name="birthday" value="2020/04/01" />
          </bean>
      
          <bean id="myBeanPostProcessor" class="com.spring.demo.converter.MyBeanPostProcess"/>
      
    • 测试

         @Test
          public void test1() {
              ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:/ApplicationContext.xml");
              Person person = (Person) ctx.getBean("person");
              System.out.println(person.getBirthday() +" " +person.getName());
          }
      
    • 输出结果

      22:15:57.407 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@dd3b207
      22:15:57.648 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 2 bean definitions from class path resource [ApplicationContext.xml]
      22:15:57.696 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myBeanPostProcessor'
      22:15:57.731 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'person'
      Wed Apr 01 00:00:00 CST 2020 你是猪
      
    • 可以看到输出的结果已经从新设置为“你是猪”。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部