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;    
    }    
	}   

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...