Spring核心总结

Spring核心一:IOC

1、什么是IOC?

	IOC的主要思想是控制反转,什么是控制反转,就是原本创建bean的方式是由我们主动去new,而现在是通过我们的配置,由Spring来进行
	bean的创建,注入,由Spring来控制bean的入口。

2、IOC的本质

	IOC的本质是容器
	Spring中IOC的核心就是bean工厂(beanFactory),bean工厂根据我们的要求生产各种各样的bean来给我们使用,然后bean工厂在这些
	bean的生命周期中开放一些接口给我们,用来插手对bean的管理。
	源码体现:beanFactory本身只是一个接口,我们主要关注的还是他的实现

spring核心bean依赖图
首先可以看出来spring核心的实现类就是DefaultListableBeanFactory,我们从它的顶级接口来看他的实现过程。从依赖图可以看出来一共有三个顶级的接口,分别是BeanFactory、AliasRegistry、SingletonBeanRegistry 。

BeanFactory
BeanFactory

BeanFactory内定义了一系列的对bean操作的接口,包括获取,匹配等方法。
BeanFactory

ListableBeanFactory

ListableBeanFactory接口是对beanFactory接口的扩展,定义了更多对bean操作的方法
ListableBeanFactory

AutowireCapableBeanFactory

AutowireCapableBeanFactory这个接口定义了自动装配bean的一系列操作,感兴趣的童鞋可以自己看一看源码
AutowireCapableBeanFactory

HierarchicalBeanFactory

HierarchicalBeanFactory主要是给工厂进行分层,只有两个简单的方法。
HierarchicalBeanFactory

ConfigurableBeanFactory

ConfigurableBeanFactory定义BeanFactory的配置.ConfigurableBeanFactory中定义了太多太多的api,比如类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁.
ConfigurableBeanFactory同时继承了HierarchicalBeanFactory 和 SingletonBeanRegistry 这两个接口,即同时继承了分层和单例类注册的功能。可以参考此文https://blog.csdn.net/likunpeng6656201/article/details/101563671
在这里插入图片描述

AliasRegistry
AliasRegistry

AliasRegistry中定义了对alias的简单的简单增改删等操作,都是bean注册别名用的。
AliasRegistry

BeanDefinitionRegistry

BeanDefinitionRegistry接口定义对BeanDefinition的各种增改删查操作。
BeanDefinitionRegistry
BeanDefinition是一个描述bean的类,里面定义了这个bean的属性。
Bean 的类名
设置父 bean 名称、是否为 primary、
Bean 行为配置信息,作用域、自动绑定模式、生命周期回调、延迟加载、初始方法、销毁方法等
Bean 之间的依赖设置,dependencies
构造参数、属性设置
BeanDefinition

SimpleAliasRegistry

SimpleAliasRegistry实现了AliasRegistry,其中的实现对别名做了一系列的操作,最后放在了一个叫aliasMap的ConcurrentHashMap中
SimpleAliasRegistry

SingletonBeanRegistry
SingletonBeanRegistry

SingletonBeanRegistry内部定义的方法是简单的注册或者获取单例bean
SingletonBeanRegistry

DefaultSingletonBeanRegistry

DefaultSingletonBeanRegistry
从上图可以看出,DefaultSingletonBeanRegistry是一个继承了SimpleAliasRegistry和实现了SingletonBeanRegistry接口的类,它的主要功能是就是管理spring中的bean。
其中包括了二级缓存、三级缓存的实现,存储单例bean、单例bean的关系、Bean所处的状态、负责单例Bean的销毁。
其中二级缓存,三级缓存,单例桶等等都是一个个ConcurrentHashMap,分别是singletonObjects ,singletonFactories ,earlySingletonObjects
感兴趣的可以自己去研究一下源码

FactoryBeanRegistrySupport

FactoryBeanRegistrySupport在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能。
其中factoryBeanObjectCache是用于存放FactoryBean单例的Map。
FactoryBeanRegistrySupport

核心DefaultListableBeanFactory

DefaultListableBeanFactory类继承了AbstractAutowireCapableBeanFactory并且实现了ConfigurableListableBeanFactory, BeanDefinitionRegistry接口,是整个bean加载的核心,是spring注册及加载bean的默认实现,上文涉及到的接口都被它实现。

Sping核心二:AOP

aop的本质

aop的本质就是拦截,在spring中aop的实现方式就是代理,代理分动态代理、静态代理,动态代理又分cglib和jdk动态代理。
源码层面的实现就是注解@EnableAspectJAutoProxy注解,而在springboot中@EnableAspectJAutoProxy默认是打开的所以不需要额外配置,所以要搞懂spring的AOP就需要从这个注解开始。

EnableAspectJAutoProxy注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({AspectJAutoProxyRegistrar.class})
public @interface EnableAspectJAutoProxy {
    boolean proxyTargetClass() default false;

    boolean exposeProxy() default false;
}

从代码里可以看到EnableAspectJAutoProxy注解用了另一个注解叫@Import导入了一个注册类叫AspectJAutoProxyRegistrar.class,那么我们先讲一下@Import

@Import

@Import可以配合 Configuration, ImportSelector, ImportBeanDefinitionRegistrar 来使用,也可以用于一个普通类的导入。
那么@Import实在什么时机将bean注入到spring的呢,这里需要了解一下spring的启动过程,首先第一个类就是SpringApplication.class,在SpringApplication中有一个方法是refreshrefresh
在这个refresh的具体实现中我们会看到spring在启动的时候会做的操作,在这里我们重点关注的是invokeBeanFactoryPostProcessors
refresh实现

refresh扩展

这里注释一下refresh里面的方法作用:
1、prepareRefresh();
//校验你的配置文件
2、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 这个是一个将BeanFactoy的加载的过程,这个方法执行完毕后,所有的定义的BeanDefinition和其他的对象都会被加载到当前,spring加载bean的核心方法,其中定义的工厂类就是上文提到的DefaultListableBeanFactory
在这里插入图片描述

3、prepareBeanFactory(beanFactory);
//对Bean Factory一些信息配置(setBeanClassLoader addBeanPostProcessor(后置处理器)等)
4、postProcessBeanFactory(beanFactory);
//允许在上下文子类中对bean工厂进行后处理
5、invokeBeanFactoryPostProcessors(beanFactory);
//触发后置处理器
6、registerBeanPostProcessors(beanFactory);
//注册拦截bean创建的后置处理器
7、protected void initMessageSource()
//初始化MesageSource 国际化
8、initApplicationEventMulticaster();
//初始化事件广播
9、onRefresh()//这个方法是一个模板方法,是交给子类来扩展的
10、registerListeners();
//注册所有的Listener
11、finishBeanFactoryInitialization(beanFactory);
//实例化所有的非延迟加载的单例Bean对象
12、finishRefresh();
//发布相关的事件
13、resetCommonCaches()
//清空盖清空的cache

我们主要看invokeBeanFactoryPostProcessors方法,继续往下追代码,在这个方法中大量用到了注册Processors的一个方法叫invokeBeanDefinitionRegistryPostProcessors
在这里插入图片描述
其中又调用了postProcessBeanFactory,我们可以通过AnnotationConfigApplicationContext中的this里面来到AnnotatedBeanDefinitionReader,可以看到registerAnnotationConfigProcessors中注册了ConfigurationClassPostProcessor。
而在ConfigurationClassPostProcessor中我们主要看postProcessBeanDefinitionRegistry方法里面的processConfigBeanDefinitions
在这里插入图片描述

在processConfigBeanDefinitions方法中有一个定义ConfigurationClassParser的地方,这个类主要是解析配置文件的,我们主要看parser.parse(candidates);这个方法
在这里插入图片描述
在这里插入图片描述
在parse中我们主要看注解方式部分,里面调用的processConfigurationClass方法,里面有个最核心的方法doProcessConfigurationClass就是我们这一次找的地方,Spring会在这里找出所有@Import注解的类,注册到容器中。
在这里插入图片描述
在这里插入图片描述
@Import注解讲完了,想了解更详细的可以去追代码,接下来继续找回正题AOP

AspectJAutoProxyRegistrar

spring给我们提供了对外的处理bean的后置处理器,这里主要介绍AOP所用到的beanPostProcessor接口,我们知道了SpringAOP是根据@Import + ImportBeanDefinitionRegistrar接口注入到Spring中的,那么ImportBeanDefinitionRegistrar到底起了什么作用。
在这里插入图片描述

1、首先它实现了ImportBeanDefinitionRegistrar,所以他肯定是个注册器,所以它的第一步是往ioc注册了一个AnnotationAwareAspectJAutoProxyCreator.class,而这个类的顶层继承了两个接口,一个是BeanPostProcessor,一个是Aware,所以这是一个后置处理器,
在refresh的时候会先把它创建再去创建bean,最后创建的bean叫internalAutoProxyCreator
在这里插入图片描述
2、获取@EnableAspectJAutoProxy注解的信息。是判断proxyTargetClass属性的值是否为true,如果为true则调用AopConfigUtils类的forceAutoProxyCreatorToUseClassProxying()方法;判断exposeProxy属性的值是否为true,如果为true则调用AopConfigUtils类的forceAutoProxyCreatorToExposeProxy()方法。这两个方式是在BeanDefinition上添加了两个对应的属性。

proxyTargetClass

这个属性如果是true,无论目标对象是否实现了接口,都是使用CGLIB代理,如果是false则如果实现了接口使用jdk动态代理,没有实现接口使用CGLIB代理

exposeProxy

这个属性如果是true,表示暴露代理,感兴趣的可以自行深入研究,主要是解决自调用失效的问题,比如@Transactional自调用失效

---------------如有错误请及时提醒作者,感谢!!-------------------------

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值