April 16, 2019 · JAVA 本文字数: 922 阅读时长:3 min 全站字数:361.8k

Spring框架的扩展点

  1. Spring设计哲学
  2. 如何定制化bean
  3. 如何扩展Spring
  4. 参考资料

Spring设计哲学

Spring框架诞生于2003年,Spring的主要目标就是让创建Java企业应用更容易。因此,Spring并没有完全支持Java EE,而是选择性支持Servlet API, WebSocket API,Concurrency Utilities, JSON Binding API , Bean Validation, JPA, JMS等。Spring框架是模块化的,最核心的是容器模块,包括配置模型和依赖注入机制。

Spring的设计哲学:

  1. 在每一层提供选择机制。最大化延迟设计决策的时间,如可以通过修改配置切换持久化实现,而不需要改代码。
  2. 满足多种需求,强大的灵活性。
  3. 强大的向后兼容。谨慎的选择支持JDK版本和第三方类库。
  4. 优雅的API设计。
  5. 注重代码质量。完整的javadoc, 没有包的循环依赖。

如何定制化bean

Spring提供三类接口来满足对Bean的定制化需求,这三类接口是Lifecycle CallbackApplicationContextAwareBeanNameAware,以及其他Aware接口。

第一种Lifecycle Callbacks主要用于和Bean的生命周期进行交互。可以通过实现InitializingBeanDisposableBean接口实现。Spring容器会在afterPropertiesSet()中调用InitializingBean,在destroy()中调用DisposableBean

但是,一般用于接收生命周期回调的最佳实践是
使用JSR-250@PostConstruct@PreDestroy注解。使用这两个注解可以和Spring解耦。另外,还有一种解耦机制就是定义Bean时的init-methoddestroy-method

在Spring内部,Spring框架使用BeanPostProcessor来处理可以发现的回调接口,并调用他们。

第二种方法,当一个Bean实现了ApplicationContextAwareBeanNameAware接口,这个Bean就会通过回调函数的形式获得ApplicationContext和Bean Name,从而可以进行定制化的配置。

第三种方法是使用各种其他Aware接口,实现的类可以获取相应的实例对象。具体参考Aware-List

如何扩展Spring

在实际开发过程中,开发者还需要扩展Spring来实现自己的需求。一般开发者不需要通过继承ApplicationContext来实现对Spring的扩展,Spring的扩展是通过插件化的接口实现:

  1. 通过使用BeanPostProcessor来自定义Bean。该接口定义了回调方法可以用于实现自定义的Bean初始化逻辑,依赖解析或者其他。如果你想在Spring容器完成了实例化,配置和初始化Bean之后进行自定的操作,就可以插入一个或者多个自定的BeanPostProcessor来实现。多个实例还可以通过实现Orderd接口来控制执行的顺序。需要注意的是BeanPostProcessor操作的是Bean实例,如果想修改Bean的定义,则需要定制化BeanFactoryPostProcessor来实现;另外,BeanPostProcessor和具体的容器绑定的,且只能在绑定的容器中生效。BeanPostProcessor提供的方法:
    • Object postProcessBeforeInitialization(Object bean, String beanName). 初始化之前的操作。
    • Object postProcessAfterInitialization(Object bean, String beanName). 初始化之后的操作。
  2. 使用BeanFactoryPostProcessor自定义配置Bean的元数据。相比BeanPostProcessorBeanFactoryPostProcessor可以读取和操作Bean的配置元数据,在容器实例化任何Bean之前进行修改。也可以通过实现Orderd接口来控制多个BeanFactoryPostProcessor的执行顺序。提供的方法有:
    • void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)。此时Bean的定义信息已经加载,但是Bean还没有初始化。
  3. 通过实现FactoryBean来自定义实例化逻辑。FactoryBean是Spring IoC容器初始化的一个可插拔的扩展点,可以实现具有较复杂实例化逻辑。提供三个方法:
    • Object getObject(). 返回这个工厂创建的实例。
    • boolean isSingleton(). 创建实例作用域,singleton还是其他。
    • Class getObjectType(). 返回创建实例的类型。

参考资料

  1. 自定义bean
  2. Spring的扩展点