过了一遍spring-core,spring-beans,spring-context这三个包,翻了一下接口和注解,这里整理记录一下方便以后使用
Spring的普通接口
Environment,环境对象
ConfigurableEnvironment,可配置的环境对象
FactoryBean,获得自行创建Bean的能力
ApplicationListener,声明为一个监听器
ApplicationEventPublisher,事件发布器
BeanFactory
ApplicationContext
ConfigurableApplicationContext
ConfigurableWebApplicationContext
这些接口都是容器对象的接口,从上到下依次继承,一般而言使用的比较多的是BeanFactory和ApplicationContext.太向下的接口没用到那么细致的功能.
带回调的接口
对带回调的接口进行一些简单的分类
普通的回调接口
InitializingBean,初始化
DisposableBean,销毁
SmartLifecycle,可以对bean的生命周期做一些细致的调整
Aware相关
BeanFactoryAware
BeanNameAware
ServletContextAware
ApplicationContextAware
ApplicationEventPublisherAware
EnvironmentAware,
ResourceLoaderAware
EmbeddedValueResolverAware
获取一些容器中的对象,名字去掉Aware就是将要在容器中获得的对象,就不写功能了.一般而言就是获得容器中对应的对象.
PostProcessor相关
BeanDefinitionRegistryPostProcessor,获得BeanDefinitionRegistry,此时继续调整BeanDefinitionRegistry(一般就是继续register)
BeanFactoryPostProcessor,获得BeanFactory,此时可以进一步调整BeanFactory(此时容器实例化了获得BeanFactory并加载了BeanDefined但是Bean尚未实例化)
BeanPostProcessor,可以获得已经完成所有配置之后的Bean,此时可以对Bean做动态代理(此时容器已经将Bean实例化)
获得一些启动时指定时刻的回调,大部分时候是用于添加/替换/删除容器中的Bean/BeanDefined对象的.
其他一些特别功能的接口
通过注解@Import导入Bean到容器时一些高级特性
ImportAware,只是获得组合注解中的参数.(1通过参数可以进一步实例化别的Bean对象,2注解参数封装成参数对象AnnotationMetadata传入到方法内(可以转成StandardAnnotationMetadata进而获取启动类都可以))
ImportSelector,返回一组待导入的class,返回的Bean可以嵌套ImportAware和ImportBeanDefinitionRegistrar接口实现.同样有特性
ImportBeanDefinitionRegistrar,获得注解中的参数,同时获得BeanDefinitionRegistry对象
常见的注解
@Bean,声名一个Bean
@Import,加入容器,这个注解带入的Bean不一定会加入到容器中,在分类上属于@Role中的基础设施,有可能在比较早的生命周期回调.
@Configuration,声名为配置类
@ComponentScan,扫描路径,注意通配符
@ImportResource,导入xml配置,classpass:
@Primary,相同类型bean指定一个默认
@AliasFor,对于自己定义的注解可以起别名和组合注解覆盖
@Order,对bean的创建定义顺序
@Autowired 根据类型注入
@Qualifier 用于多个接口实现时配合@Autowired限定bean的name
@Value 通过SPEL表达式获得值(可以在属性,方法,参数上)
常见的实现类
StandardBeanExpressionResolver,SPEL标准解析器
GenericBeanDefinition,一般的Bean被抽象成这个对象放入Registry中
BeanDefinitionRegistry,BeanDefinition收集器
RuntimeBeanReference,在BeanDefined阶段的占位符对象
GenericWebApplicationContext,一般的web容器
总结
其实把功能分解拆开之后看Spring似乎也没有那么"大"了
网友评论