zoukankan      html  css  js  c++  java
  • Spring系列.容器扩展点

    通常我们不需要继承ApplicationContext的具体实现类,Spring提供了相关接口让开发人员扩展Spring IoC容器。(注意和“Bean扩展点”的区别)

    BeanPostProcessor

    BeanPostProcessor的实现类注册到Spring IOC容器后,对于该Spring IOC容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和任意已声明的init方法)调用前,将会调用BeanPostProcessor中的postProcessBeforeInitialization方法,而在bean实例初始化方法调用完成后,则会调用BeanPostProcessor中的postProcessAfterInitialization方法,整个调用顺序可以简单示意如下:

    Spring IOC容器实例化Bean
    调用BeanPostProcessor的postProcessBeforeInitialization方法
    调用bean实例的初始化方法
    调用BeanPostProcessor的postProcessAfterInitialization方法

    BeanPostProcessor针对单独的容器中生效。比如在子容器中配置的,只会在子容器中生效。 另外实现BeanPostProcessor的Bean需要被提前被容器初始化,这个Bean直接依赖的其他Bean将不会被BeanPostProcessor处理。

    BeanFactoryPostProcessor

    BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理。BeanFactoryPostProcessor是针对于bean容器的,在调用它时,BeanFactory只加载了bean的定义,还没有对它们进行实例化,所以可以通过它对Bean定义的重新处理来达到影响之后实例化bean的效果。

    BeanFactoryPostProcessor的主要作用是读取Bean的定义,以及在某些情况下修改Bean的定义。Spring中预先定义的BeanFactoryPostProcessor有:

    • PropertyOverrideConfigurer
    • PropertyPlaceholderConfigurer(在读取Bean定义时替换占位符)

    That is, the Spring IoC container lets a BeanFactoryPostProcessor read the configuration metadata and potentially change it before the container instantiates any beans other than BeanFactoryPostProcessor instances.

    FactoryBean

    一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean 。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在bean中提供大量的配置信息,配置方式的灵活性是受限的,这时采用编码的方式可能会得到一个简单的方案。Spring为此提供了一个org.Springframework.bean.factory.FactoryBean的工厂类接口,用户可以通过实现该接口定制实例化bean的逻辑。(后面Spring又提供了@Configration和@Bean这种方式,一定程度上可以替代FactoryBean)

        public   class  CarFactoryBean  implements  FactoryBean<Car>  {    
    	    private  String carInfo ;    
    	    public  Car getObject ()   throws  Exception  {    
    	        Car car =  new  Car () ;    
    	        String []  infos =  carInfo .split ( "," ) ;    
    	        car.setBrand ( infos [ 0 ]) ;    
    	        car.setMaxSpeed ( Integer. valueOf ( infos [ 1 ])) ;    
    	        car.setPrice ( Double. valueOf ( infos [ 2 ])) ;    
    	        return  car;    
    	    }    
    	    public  Class<Car> getObjectType ()   {    
    	        return  Car. class ;    
    	    }    
    	    public   boolean  isSingleton ()   {    
    	        return   false ;    
    	    }    
    	    public  String getCarInfo ()   {    
    	        return   this . carInfo ;    
    	    }    
        
        // 接受逗号分割符设置属性信息    
        public   void  setCarInfo ( String carInfo )   {    
            this . carInfocarInfo  = carInfo;    
        }    
    	}   
    
  • 相关阅读:
    安装node配置环境变量,解决某组件(如cordova,webpack等)“不是内部命令”问题
    用js控制css属性
    用javascript动态改变网页文字大小
    在无代码文件的aspx文件中添加类、函数和字段的方法
    HBase-0.98.3 如何调整RPC连接的数量
    double类型相等判断 [转]
    Virtual Memory Usage from Java under Linux [转]
    手工释放SWAP空间的方法[转]
    maven配置 指定jdk版本
    maven配置: 生成war的同时生成jar, 并在其他artifact配置依赖于这个jar
  • 原文地址:https://www.cnblogs.com/54chensongxia/p/13065626.html
Copyright © 2011-2022 走看看