zoukankan      html  css  js  c++  java
  • spring常用接口 InitializingBean的作用

    工作中遇到spring接口中的InitializingBean接口。浅浅的解说一下。

    --------------------------------------------------------------------------------------

    先探讨一下spring初始化bean方式:

    //这个时候补充一下spring初始化bean的方式

            /**

        常用的设定方式有以下三种:
        通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
        通过 <bean> 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;
        在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。

            */

        public class InitSequenceBean implements InitializingBean {    
         
        public InitSequenceBean() {    
           System.out.println("InitSequenceBean: constructor");    
        }    
           
        @PostConstruct    
        public void postConstruct() {    
           System.out.println("InitSequenceBean: postConstruct");    
        }    
           
        public void initMethod() {    
           System.out.println("InitSequenceBean: init-method");    
        }    
           
        @Override    
        public void afterPropertiesSet() throws Exception {    
           System.out.println("InitSequenceBean: afterPropertiesSet");    
        }    

    并且在配置文件中添加如下Bean定义:<bean class="InitSequenceBean" init-method="initMethod"></bean>

    输出结果:

    InitSequenceBean: constructor
    InitSequenceBean: postConstruct
    InitSequenceBean: afterPropertiesSet
    InitSequenceBean: init-method
     
    通过上述输出结果,说明三种初始化的顺序是:
    Constructor > @PostConstruct > InitializingBean > init-method

    --------------------------------------------------------------------------------------

    继续说明InitializingBean接口:
    InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。

    测试程序如下:

    import org.springframework.beans.factory.InitializingBean;
      public class InitializingBeanT implements InitializingBean{ 
            @Override  
            public void afterPropertiesSet() throws Exception {  
                System.out.println("InitializingBean");          
            }  

       //用于在spring配置文件中(init-method)用来比较实现InitializingBean和在配置文件中init-method那个先执行
            public void testInit(){  
                System.out.println("init-method");          
            }  
        }

    同时在配置文件中配置:

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"  
        xmlns:tx="http://www.springframework.org/schema/tx"  
        xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
        <bean id="testInitializingBean" class="com.InitializingBeanT" ></bean>  
    </beans>

    main主程序如下:

    public class Main {  
        public static void main(String[] args){  
            ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/com/beans.xml");  
        }  
    }

    运行Main程序,打印如下结果:
    ceshi InitializingBean  
    这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。


    问题:实现InitializingBean接口与在配置文件中指定init-method有什么不同?
    修改配置文件,加上init-method配置,修改如下:

    <?xml version="1.0" encoding="UTF-8"?>  
    <beans xmlns="http://www.springframework.org/schema/beans"  
        xmlns:context="http://www.springframework.org/schema/context"  
        xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
        xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"  
        xmlns:tx="http://www.springframework.org/schema/tx"  
        xsi:schemaLocation="  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
        <bean id="testInitializingBean" class="com.TestInitializingBean" init-method="testInit"></bean>  
    </beans>

    在配置文件中加入init-method="testInit"。
    运行Main程序,打印如下结果:
    InitializingBean
    init-method
    由结果可看出,在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。

    总结:
    1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用
    2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖
    3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

  • 相关阅读:
    2015/5/10站立会议(补发)
    2015/5/11站立会议(补发)
    2015/5/12站立会议(补发)
    5/13站立会议(补发)
    面向对象——抽象类和接口
    面向对象(三)——静态
    面向对象——三大特性(封装、继承、多态)
    ADO.NET
    面向对象 封装练习题
    面向对象 封装
  • 原文地址:https://www.cnblogs.com/JKayFeng/p/5974104.html
Copyright © 2011-2022 走看看