Spring中常用的那些接口
Spring的核心就是Bean管理,关于Bean定义了很多可扩展性的接口,通过这些扩展接口可以实现很多功能。
比如动态创建bean,延迟动态创建bean,动态注入bean,动态修改bean等等。
下面介绍Spring中一些常用的接口:
Bean管理
BeanFactory和ApplicationContext是Spring中最核心的接口,先放一张核心类图:
BeanFactory
这是Spring中最核心的接口,也是根接口。定义了获取bean及bean基础属性的相关方法。此接口需要重新实现的场景非常少,一般是Spring内部配置,程序中注入/获取使用即可。
常用方法:
- getBean 根据beanId/beanClass获取Bean
- containsBean bean是否已加载
- isSingleton 是否是单例
- isTypeMatch 类型是否匹配
- getType 获取bean class
- getAliases 获取bean别名
ApplicationContext
继承了以下接口:ApplicationEventPublisher, BeanFactory, EnvironmentCapable, HierarchicalBeanFactory, ListableBeanFactory, MessageSource, ResourceLoader, ResourcePatternResolver
同时也实现了以上接口的所有功能,程序中通过此接口就可以使用以上接口的功能。
常用方法:
- getId 获取spring容器ID
- getApplicationName 获取应用明
- getDisplayName 获取displayName
- getStartupDate 获取启动时间
- getAutowireCapableBeanFactory 获取autowire的beanFactory
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
- ApplicationEventPublisherAware's setApplicationEventPublisher
- MessageSourceAware's setMessageSource
- ApplicationContextAware's setApplicationContext
- ServletContextAware's setServletContext (仅适用于Spring Web环境下)
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中的属性值。
常用方法
- getActiveProfiles 获取当前激活的环境
- getDefaultProfiles 获取当前默认环境
- acceptsProfiles 检测环境是否处于激活状态
- containsProperty 是否包含属性key
- getProperty 根据key获取属性
- getRequiredProperty 根据key获取属性,若值不存在则抛出
IllegalStateException
- resolvePlaceholders 处理el表达式,并获取对应值。例如:传入${spring.profiles.active},就可以获取对应值。跟getProperty不同的是,getProperty需要的是具体key名称,而不是表达式。
- resolveRequiredPlaceholders 同resolvePlaceholders,不过值不存在会抛出
IllegalStateException
Lifecycle
Spring容器的生命周期接口,Bean实现此接口后可以收到Spring生命周期变化的调用。
常用方法:
- start 启动事件
- stop 停止事件
- isStarted 判断是否启动