Spring底层的核心原理解析

这篇文章大致讲解一下spring的整个执行流程,也就是在我们脑子里面建立一个笼统的概念

spring如何创建一个容器呢

容器里面是对象

Spring底层的核心原理解析_第1张图片

上面就是利用AnnotationConfigApplicationContext这个对象,然后传入了一个配置类的字节码对象给我们创建一个Spring容器,然后我们利用这个容器,就可以创建我们想要的对象

那我们还有什么方法来创建容器呢?

采用ClassPathXmlApplicationContext("bean.xml"),这个对象就是通过spring的xml配置文件来获取对象,下面我们看一下具体的代码

Spring底层的核心原理解析_第2张图片

下面我们去看获取

 Spring底层的核心原理解析_第3张图片

下面看一下这几个类与类之间的依赖关系

Spring底层的核心原理解析_第4张图片 上面就是这两个类的具体使用方法

下面讲解一下Spring对象的大致构建过程

我们知道Spring是会帮我们创建一个UserService对象,那么他与我们直接new出来的一个对象有什么不同呢?

比如下面这两个对象

都是创建UserService对象,不同点在哪?

我们先来看一下UserService的对象内部 

Spring底层的核心原理解析_第5张图片

里面有一个OrderService对象,已经采用@Autowired这个注解给我们注进来了

说明了Spring在构建这个UserService的时候,已经帮我们创建了OrderService这个对象,那么如果我们直接new UserService(),很明显内部这个OrderService是没有对象指引的,因为在UserService内部就没有一个有参的构造函数给orderService这个属性传递值,也没有什么可用方法调用给OrderService赋值

这就是一个小的不同点

那么面继续分析,如果spring要生产一个UserService对象,那么无非就要去调用它的构造方法,这里肯定是无参构造方法,也就是说

那么内部还有一个对象啊,他也是给我们生产出来的,就是OrderService这个对象

Spring底层的核心原理解析_第6张图片

下面是具体的操作代码 

Spring底层的核心原理解析_第7张图片

那么field.set()方法里面的orderService的值具体怎么来呢?

那我们继续往下面走,假设我们现在给这个Userservice里面增加一个属性

Spring底层的核心原理解析_第8张图片 假设这个admin是我们管理员账号与密码,我们想的是UserService一旦被Spring 创建,那么里面的Admin就要自动填充好值,如果说给Admin添加一个Autowired当然也是可以,但是如果这样的话,那么拿到的值就不是我们想要的,因为admin需要我们去查询数据库,然后封装一个User对象,然后在给到他,但是spring是真不知道怎么去查数据库,去查什么表的。

所以,我们在这下面可以给它设置一个方法

Spring底层的核心原理解析_第9张图片

这个方法加了@PostConstruct注解

这个注解的意思,在对象通过构造完成之后,就会调用起来

那么Spring的做法就是,还是用反射技术来做

Spring底层的核心原理解析_第10张图片 那我们还有一种做就是我们让UserService这个类去实现Initialize这个接口。然后去实现里面的afterPropertiesSet()这个方法,也可以执行上面的操作

比如按照下面做法来做

Spring底层的核心原理解析_第11张图片

 判断是否是是他的实例子啊初始化的时候,可以做如下判断

obt instanceOf InitializingBean(是否是它的实例)

我们简单去看一下源码:Ctrl+N

Spring底层的核心原理解析_第12张图片

然后我们直接跳转到下面这个函数里面

Spring底层的核心原理解析_第13张图片 然后再进如到下面这个函数里面

Spring底层的核心原理解析_第14张图片

Spring底层的核心原理解析_第15张图片 总结一下,下面大概就是Bean的创建的生命周期

Spring底层的核心原理解析_第16张图片

 如果一个对象里面不止有无参构造函数呢

 

 下面说一下Spring的判断逻辑

Spring底层的核心原理解析_第17张图片

 

说的简单点,只要有无参,一定会调用无参进行对象的构建,如果有多个有参,没有无参,但是没在某一个构造方法加上@Autowired注解 ,就会报错,spring不知道用哪一个构造方法

如果Spring选择了一个有参构造方法,需要传入参数,那么参数是怎么来的

Spring底层的核心原理解析_第18张图片

 确定用哪个构造方法,确定入参的Bean对象,这个过程就叫做推断构造方法。

AOP的大致流程

Spring底层的核心原理解析_第19张图片 我之前说切面的时候,就说了切面就是一个类直接杀向另外一个类里面来,对另外一个类里面的方法做一些增强操作,这里应该是用到了动态代理技术去增强目标对象的方法

先来解释上面的话:1.找出所有切面Bean
Spring底层的核心原理解析_第20张图片

 在xml配置文件里面就是下面这样

Spring底层的核心原理解析_第21张图片

2.遍历切面中的每一个方法,看看是否写了@Before(前置通知) @AfterReturning(后置通知)这些注解在上面

Spring底层的核心原理解析_第22张图片

 3.如果写了,我们去看对应的Pointcut对应的拦截点与当前我们需要生成的代理对象是否匹配,如果匹配,就表示需要把当前对象进行AOP会给我们生成一个代理对象

Spring底层的核心原理解析_第23张图片

如果找到了,就用cglib动态代理我们的每一个切入点进行动态代理增强

这里简单说一下cglib

Spring底层的核心原理解析_第24张图片

Spring底层的核心原理解析_第25张图片 

下面说一下Cglib进行AOP的大致流程 

 Spring底层的核心原理解析_第26张图片

 好了,大致先说到这,祝大家早安午安晚安。

你可能感兴趣的:(源码专栏,spring,java,后端)