目录
- 核心注解
- 核心组件接口分析
- 基础接口
- Resource+ResourceLoader
- Resource
- ResourceLoader
- BeanFactory
- 结构解析图示
- 核心的子接口
- BeanDefinition
- 加载注册流程(xml形式的)
- BeanDefinitionReader
- BeanDefinitionRegistry
- ApplicationContext
- 类结构图示
- 结构解析
- Aware
- 接口类图
- xxAware是什么时候赋值进来
- 判断后置处理器
- 基础类
- DefaultListableBeanFactory
- DefaultSingletonBeanRegistry
- GenericApplicationContext
核心注解
注解 | 功能 |
---|---|
@Bean | 容器中注册组件 |
@Primary | 同类组件如果有多个,标注主组件 |
@DependsOn | 组件之间声明依赖关系 |
@Lazy | 组件懒加载(最后使用的时候才创建) |
@Scope | 声明组件的作用范围(SCOPE_PROTOTYPE,SCOPE_SINGLETON) |
@Configuration | 声明这是一个配置类,替换以前配置文件 |
@Component | @Controller、@Service、@Repository |
@Indexed | 加速注解,所有标注了 @Indexed 的组件,直接会启动快速加载 |
@Order | 数字越小优先级越高,越先工作 |
@ComponentScan | 包扫描 |
@Conditional | 条件注入 |
@Import | 导入第三方jar包中的组件,或定制批量导入组件逻辑 |
@ImportResource | 导入以前的xml配置文件,让其生效 |
@Profile | 基于多环境激活 |
@PropertySource | 外部properties配置文件和JavaBean进行绑定.结合ConfigurationProperties |
@PropertySources | @PropertySource组合注解 |
@Autowired | 自动装配 |
@Qualifier | 精确指定 |
@Value | 取值、计算机环境变量、JVM系统。xxxx。@Value(“${xx}”) |
@Lookup | 单例组件依赖非单例组件,非单例组件获取需要使用方法 |
注:@Indexed 需要引入依赖
<groupId>org.springframework</groupId> <artifactId>spring-context-indexer</artifactId> <optional>true</optional> </dependency>```
核心组件接口分析
基础接口
Resource+ResourceLoader
Resource
它是spring自己定义的一个资源抽象接口,表示所有需要加载到spring的bean容器中的资源,来自于xml以及注解的bean,甚至是网络和本地磁盘当中,都可以用它表示
ResourceLoader
spring定义的资源加载器(策略模式接口),通过不同的策略实现,加载不同情况的bean封装为resource资源
AbstractApplicationContext作为环境类持有ResourcePatternResolver接口(通过这个策略模式去调用真正的资源加载实现类)
BeanFactory
作为spring的一个基础的抽象工厂接口
结构解析图示
核心的子接口
- HierarchicalBeanFactory:定义父子工厂(父子容器)
- ListableBeanFacotory:的实现是DefaultListableBeanFactory,保存了ioc容器中的核心信息
- AutowireCapableBeanFactory:提供自动装配能力
- AnnotationApplicationContext组合了档案馆,他有自动装配能力
BeanDefinition
Bean的定义信息接口,封装bean需要的信息属性
加载注册流程(xml形式的)
他会被
BeanDefinitionHolder
类进行一层封装,它封装了bean的名称和别名数组,以及BeanDefinition
自身,方便后续对他的处理操作
BeanDefinitionReader
读取Bean信息的策略接口,他是Bean信息的一个读取器,他有XmlBeanDefinitionReader
具体的实现类用来读取xml中的bean配置信息.它本身也持有IOC容器类的环境,组合传进去的
BeanDefinitionParserDelegate
用来解析从xml配置文件读取到的Dom文档(解释器模式)
读取器具体的实现又去组合资源加载策略接口ResourceLoader
(Spring中运用了相当之多的组合,他在组合与继承以及接口之间做了相当美妙的平衡,我觉得这里面才是值得仔细去思考和学习的)
BeanDefinitionRegistry
bean定义信息注册中心,提供一个必须要实现的registerBeanDefinition
方法,由具体的类去实现
ApplicationContext
类结构图示
结构解析
- IOC事件派发器
- 国际化解析
- bean工厂功能–自动装配是被组合进来的
- 资源解析功能
Aware
接口类图
xxAware是什么时候赋值进来
判断后置处理器
if (!(bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware ||
bean instanceof ApplicationStartupAware)) {
return bean;
}
先去缓存的单实例池拿到bean,拿不到的话再去创建
基础类
DefaultListableBeanFactory
这是spring的关键类,属于是spring的’档案馆’,他继承和实现一系列的接口并且通过组合的方式,保存了spring的bean实例信息(通过多个ConcurrentHashMap),后续spring拿到这些读取到的bean图纸信息,再根据信息去创建相应的Bean
//组合模式,Spring里面允许有很多工厂(工厂之间的bean可以隔离开 不过实际上目前没有这么使用过的)
private static final Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
new ConcurrentHashMap<>(8);
/** Map of bean definition objects, keyed by bean name. */
//所有BeanDefinition信息按照名字对应BeanDefinition关系都保存好了
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);
/** Map of singleton-only bean names, keyed by dependency type. */
//Spring中按照类型得到组件的一个底层池
//按照类型保存单实例bean的名称
private final Map<Class<?>, String[]> singletonBeanNamesByType = new ConcurrentHashMap<>(64);
/** List of bean definition names, in registration order. */
//保存所有bean定义的名称
private volatile List<String> beanDefinitionNames = new ArrayList<>(256);
DefaultSingletonBeanRegistry
这是spring的单例对象缓存池,包括三级缓存也是在这个类中。
/** spring是使用享元完成单例模式,使用单例对象池(单例享元池返回组件) */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);
GenericApplicationContext
将上面的DefaultListableBeanFactory
组合进来用来存储bean的定义和信息,通过继承资源类和实现ApplicationContext
接口获得ioc容器