微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐