春天启动加载程序的几种方法介绍

  

关于在spring 容器初始化bean和销毁前所做的操作定义方式有三种:

  

第一种:通过注解@PostConstruct和@PreDestroy方法实现初始化和销毁豆之前进行的操作

        进口javax.annotation.PostConstruct;   进口javax.annotation.PreDestroy;      公开课DataInitializer {   @PostConstruct   公共空间initMethod()抛出异常{   system . out。println (“initMethod被执行”);   }   @PreDestroy   公共空间destroyMethod()抛出异常{   system . out。println (“destroyMethod被执行”);   }   }      

第二种是:通过在xml中定义init方法和,destory-method方法

        公开课DataInitializer {   公共空间initMethod()抛出异常{   system . out。println (“initMethod被执行”);   }   公共空间destroyMethod()抛出异常{   system . out。println (“destroyMethod被执行”);   }   }      

代码如下:
  & lt; bean id=癲ataInitializer”类=" com.somnus.demo.DataInitializer " init方法=癷nitMethod destory-method=癲estroyMethod”/祝辞,
  
  

  

第三种是:通过豆实现InitializingBean和DisposableBean接口

        进口org.springframework.beans.factory.DisposableBean;      公共类DataInitializer实现InitializingBean DisposableBean {      @Override   公共空间afterPropertiesSet()抛出异常{   system . out。println (“afterPropertiesSet被执行”);   }      @Override   公共空间摧毁()抛出异常{   system . out。println(“摧毁被执行”);   }      }      

,其中第一种和第二种是同一种形式,只不过一种xml配置,另外一种采用注解形式罢了,有很大区别的是第三种,如果同一个bean同时采用两种方式初始化的时候执行某个方法,首先在执行顺序上就会体现出来。
  

  

先执行afterPropertiesSet(),后执行initMethod ()

  

这里我们看下源码
  

  

这方式在春天中是怎么实现的?
  

  

通过查看春天的加载bean的源码类(AbstractAutowireCapableBeanFactory)可看出其中奥妙
  

  

AbstractAutowireCapableBeanFactory类中的invokeInitMethods讲解的非常清楚,源码如下:

        保护无效invokeInitMethods (String beanName、最终对象bean, RootBeanDefinition mbd)   {抛出Throwable//判断该bean是否实现了实现了InitializingBean接口,如果实现了InitializingBean接口,则只掉调用bean的afterPropertiesSet方法   布尔isInitializingBean=(bean实例InitializingBean);   如果(isInitializingBean,,(mbd==null | | ! mbd.isExternallyManagedInitMethod (“afterPropertiesSet”))) {   如果(logger.isDebugEnabled ()) {   logger.debug(“调用afterPropertiesSet()在bean名称+ beanName +“”);   }      如果(System.getSecurityManager () !=null) {   尝试{   AccessController。doPrivileged(新的PrivilegedExceptionAction () {   公共对象的run()抛出异常{//直接调用afterPropertiesSet   ((InitializingBean) bean) .afterPropertiesSet ();   返回null;   }   },getAccessControlContext ());   }捕捉(PrivilegedActionException pae) {   把pae.getException ();   }   }   其他{//直接调用afterPropertiesSet   ((InitializingBean) bean) .afterPropertiesSet ();   }   }   如果(mbd !=null) {   字符串initMethodName=mbd.getInitMethodName ();//判断是否指定了init方法方法,如果指定了init方法方法,则再调用制定的init方法   如果(initMethodName !=零,,! (isInitializingBean,,“afterPropertiesSet .equals (initMethodName)),,   ! mbd.isExternallyManagedInitMethod (initMethodName)) {//进一步查看该方法的源码,可以发现init方法方法中指定的方法是通过反射实现   invokeCustomInitMethod (beanName bean, mbd);   }   }      之前      

总结:
  

  

1:春季为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init方法指定,两种方式可以同时使用

  

2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init方法指定的方法效率相对来说要高点。但是init方法方式消除了对春天的依赖

  

3:如果调用afterPropertiesSet方法时出的错,则不调用init方法指定的方法。

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

春天启动加载程序的几种方法介绍

Copyright © 2020-2023 feiqueyun.cn. All Rights Reserved. 肥雀云_南京肥雀信息技术有限公司版权所有 南京肥雀信息技术有限公司 苏ICP备16063723号-5