Spring源码学习-核心注解,架构以及整体流程

核心注解

注解功能
@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单例组件依赖非单例组件,非单例组件获取需要使用方法

Lookup注解可以用于单实例bean中获取原型模式的多实例bean,他只能用于get方法上面,@autowired这种注解还是会获取到相同的多实例bean。并且对于@Bean加载的bean实例他不生效

注:@Indexed 需要引入依赖

	<groupId>org.springframework</groupId>
	<artifactId>spring-context-indexer</artifactId>
	<optional>true</optional>
</dependency>```

核心组件接口分析

  • 基础接口
    • Resource+ResourceLoader
    • BeanFactory
    • BeanDefinition
    • BeanDefinitionReader
    • BeanDefinitionRegistry
    • ApplicationContext
    • Aware
  • 生命周期-后置处理器
    • BeanFactoryPostProcessor
    • InitializingBean
    • BeanPostProcessor

基础接口

Resource+ResourceLoader
Resource

它是spring自己定义的一个资源抽象接口,表示所有需要加载到spring的bean容器中的资源,来自于xml以及注解的bean,甚至是网络和本地磁盘当中,都可以用它表示

ResourceLoader

spring定义的资源加载器(策略模式接口),通过不同的策略实现,加载不同情况的bean封装为resource资源
AbstractApplicationContext作为环境类持有ResourcePatternResolver接口(通过这个策略模式去调用真正的资源加载实现类)

BeanFactory

作为spring的一个基础的抽象工厂接口

结构解析图示

BeanFactory

核心的子接口
  • 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
类结构图示

ApplicationContext

结构解析
  • IOC事件派发器
  • 国际化解析
  • bean工厂功能–自动装配是被组合进来的
  • 资源解析功能
Aware
接口类图

Aware

xxAware是什么时候赋值进来

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容器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life or die

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值