zoukankan      html  css  js  c++  java
  • Spring的Bean的生命周期以及Bean的后置处理器

    Bean的生命周期:

    Spring IOC 容器可以管理 Bean 的生命周期,
    Spring 允许在 Bean 生命周期的特定点执行定制的任务.
    Spring IOC 容器对 Bean 的生命周期进行管理的过程:
          1通过构造器或工厂方法创建 Bean 实例
          2为 Bean 的属性设置值和对其他 Bean 的引用
          3调用 Bean 的初始化方法(可以人为指定,利用Bean标签的inti-method属性指定初始化方法,不指定就默认忽略这步骤) Bean 可以使用了
          4当容器关闭时, 调用 Bean 的销毁方法(可以人为指定,利用Bean标签的destroy-method属性指定销毁方法,不指定就默认忽略这步骤 )

    代码示例:
    Bean实例代码:

    package com.jeremy.spring.cycle;
    
    public class person {
            private String Name;
            public void setName(String name) {
                Name = name;
                System.out.println("Setter............");
            }
            public person() {
                System.out.println("person constructor.......");
            }
            
            public void init(){
                System.out.println("init......");
            }
            public void destory(){
                System.out.println("desdtory......");
            }
    
            @Override
            public String toString() {
                return "person [Name=" + Name + "]";
            }

    配置了init-method和destroy-method后

    测试代码:

        @Test
        public void testNoProcessorCycle(){
            ConfigurableApplicationContext caContext=new ClassPathXmlApplicationContext("Bean-cycle.xml");
            person person=(com.jeremy.spring.cycle.person) caContext.getBean("person");
            caContext.close();
        }

    测试结果:

    person constructor.......
    Setter............
    init......
    2014-10-14 19:49:36 org.springframework.context.support.AbstractApplicationContext doClose
    信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@8965fb: startup date [Tue Oct 14 19:49:35 CST 2014]; root of context hierarchy
    desdtory......

    证明Bean的声明流程如上所说

    1为什么需要Bean的后置处理器(就是用来在容器调用Bean的init()的方法前后进行处理)---一旦IOC配置了Bean的后置处理器是对Bean所在的IOC容器里面所有Bean都是有效的
    如果不配置后置处理器,每次IOC容器就直接示例化Bean,但是如果再实际的开发中,我们需要在Bean初始前配置和其他的初始化后添加一些自己的逻辑处理??那怎么办,那这时候就需要用到Bean的后置处理器了

    2配置Bean后置处理器的步骤:

      1需要新建一个类实现BeanPostProcessor接口,并实现 postProcessAfterInitialization(Object arg0, String arg1), postProcessBeforeInitialization(Object arg0, String arg1)两个方法

       arg0:就是传入的Bean对象,
       arg1:就是Bean的ID值
       返回值:就是返回一个Bean对象,我们也可以认为的修改返回的Bean对象,不一定一定要返回容器初始化的那个Bean对象
      代码下:
      

    package com.jeremy.spring.cycle;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        public MyBeanPostProcessor() {
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public Object postProcessAfterInitialization(Object arg0, String arg1)
                throws BeansException {
            System.out.println("before init..........."+arg0.getClass());
            return arg0;
        }
    
        @Override
        public Object postProcessBeforeInitialization(Object arg0, String arg1)
                throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("after init..........."+arg0.getClass());
            return arg0;
        }
    
    }

    2在XML配置文件配置后置处理器,

    <!-- 配置 bean 后置处理器: 不需要配置 id 属性, IOC 容器会识别到他是一个 bean 后置处理器, 并调用其方法 -->
    <bean class="com.jeremy.spring.cycle.MyBeanPostProcessor"></bean>

    3测试代码

    @Test
        public void testNoProcessorCycle(){
            ConfigurableApplicationContext caContext=new ClassPathXmlApplicationContext("Bean-cycle.xml");
            person person=(com.jeremy.spring.cycle.person) caContext.getBean("person");
            caContext.close();
        }

    运行结果:
    这是具有后置处理器Bean的生命流程流程如下:

    person constructor.......
    Setter............

    before init...........class com.jeremy.spring.cycle.person
    init...................
    after init...........class com.jeremy.spring.cycle.person
    destory.....................

  • 相关阅读:
    【转】Linq Group by
    SmtpClient发邮件时为什么用MailMessage.From而不用MailMessage.Sender
    HttpClient异步调用WEB服务
    WPF MVVM框架下,VM界面写控件
    WPF 后台读取样式文件
    vs2017 乱码
    ClickOnce 和管理员权限
    EF code first Mysql 更换主键类型
    Linq Group By
    Mvc api HelpPage 与注释
  • 原文地址:https://www.cnblogs.com/jeremy-blog/p/4025129.html
Copyright © 2011-2022 走看看