Spring 的核心就是 Bean 管理,关于 Bean 定义了很多可扩展性的接口,通过这些扩展接口可以实现很多功能。
比如动态创建 bean,延迟动态创建 bean,动态注入 bean,动态修改 bean 等等。
下面介绍 Spring 中一些常用的接口:
Bean 管理
BeanFactory 和 ApplicationContext 是 Spring 中最核心的接口。
BeanFactory
这是 Spring 中最核心的接口,也是根接口。定义了获取 bean 及 bean 基础属性的相关方法。此接口需要重新实现的场景非常少,一般是 Spring 内部配置,程序中注入 / 获取使用即可。
ApplicationContext
继承了以下接口:ApplicationEventPublisher, BeanFactory, EnvironmentCapable, HierarchicalBeanFactory, ListableBeanFactory, MessageSource, ResourceLoader, ResourcePatternResolver
同时也实现了以上接口的所有功能,程序中通过此接口就可以使用以上接口的功能。
Aware 接口
Aware:adj. 意识到的。在程序中一般代表自动发现(个人理解),在 Spring 中的功能就是自动注入。
Spring 定义了一批 Aware 接口,被 Spring 管理的 Bean 只需要实现 XXAware 接口,就可以获取相对应的资源。下面是一些常用的 Aware 接口极其作用:
- BeanNameAware’s setBeanName
- BeanClassLoaderAware’s setBeanClassLoader
- BeanFactoryAware’s setBeanFactory
- EnvironmentAware’s setEnvironment
- EmbeddedValueResolverAware’s setEmbeddedValueResolver
- ResourceLoaderAware’s setResourceLoader (only applicable when running in an application context)
- ApplicationEventPublisherAware’s setApplicationEventPublisher (only applicable when running in an application context)
- MessageSourceAware’s setMessageSource (only applicable when running in an application context)
- ApplicationContextAware’s setApplicationContext (only applicable when running in an application context)
- ServletContextAware’s setServletContext (only applicable when running in a web application context)
Bean 生命周期
FactoryBean(创建 Bean)
如果一个 Bean 实现了此接口,那么该 Bean 将不直接作为最终 Bean 的实例,而是把实现的 getObject 方法返回作为最终的实例。
此接口在框架内部大量使用,例如 AOP ProxyFactoryBean 或 JndiObjectFactoryBean,它也可以用于定制组件。Dubbo 中也通过此接口来实现动态加载生产者,具体参考 com.alibaba.dubbo.config.spring.ReferenceBean
InitializingBean(初始化 Bean)
如果 Bean 实现了此接口,在 Bean 创建完成之后会调用 afterPropertiesSet 方法,程序可以通过此接口方法做一些初始化相关的工作。
BeanPostProcessor(后置处理 Bean)
Factory Hook,允许自定义修改新的 Bean 实例。执行顺序在 afterPropertiesSet 之后。
可以通过此接口实现动态 / 依赖配置 Bean 的功能,例如 Dubbo 中消费者通过 @Reference 引用生产者,具体参考 com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor
DisposableBean(销毁 Bean)
当 Spring 容器关闭时会进行所有 Bean 的销毁,若 Bean 实现了此接口,则销毁时会调用 destroy 方法。程序可以通过此接口完成一些依赖关闭的功能。
其他
Environment
当前应用正在运行环境的接口,通过此接口可以获得配置文件和属性。该接口还继承了 PropertyResolver,可以获取 placeholder 中的属性值。
Lifecycle
Spring 容器的生命周期接口,Bean 实现此接口后可以收到 Spring 生命周期变化的调用。