您现在的位置是:首页 >技术杂谈 >spring底层原理 IOC与AOP网站首页技术杂谈

spring底层原理 IOC与AOP

隔江远岸 2023-06-18 20:00:03
简介spring底层原理 IOC与AOP

关于对IOC与AOP的理解

一套系统是这样的,web服务器,tomcat,一旦启动之后,他就可以监听一个端口号的http请求,然后可以把请求转交给你的servlet  jsp,配合起来使用,servlet处理请求

关于ioc:

首先Tomcat在启动的时候,会去启动这个 spring容器,spring容器呢,会根据xml的配置或者是我们配的注解,去实例化一些bean对象,然后根据xml配置或者注解,去对bean对象之间的引用关系,来进行一个依赖注入, 让类与类之间解耦

底层技术:反射,会根据类来构建相应的对象出来

spring ioc 系统的类与类之间彻底的解耦合

举个例子就比如说人饿了想要吃饭。如果不使用IOC的话,你就得自己去菜市场买菜、做饭才能吃上饭。用了IOC以后,你可以到一家饭店,想吃什么菜你点好就可以了,具体怎么做你不用关心,饭店做好了,服务员端上来你负责吃就可以了,其它的交给饭店来做。

AOP:     代码复用!

原本是几十个service组件中,类似的一样的代码重复的代码  要在几十个地方去写

但是现在是只需要在一个地方写好  放进动态代理中即可  

做一个切面,在需要大量重复功能的类的所有方法中  在所有这些相似方法开始运行的时候,都去开启一个事务,在所有这些方法运行完毕之后去根据是否抛出异常来判断一下,如果抛出异常,就回滚事务,如果没有异常就提交事务

面向切面编程   aspect

动态代理技术   动态的创建一个代理类出来,创建这个代理类的实例对象,在这个里面引用你真正自己写的类,所有的方法的调用,都是先走代理类的对象,他负责做一些代码上的增强,再去调用你写的那个类

通俗说就是 一个班的学生交了作文上去   老师都做了同样的润色  然后交给学校

他会给你那些类生成动态代理    大概就是会生成一个动态代理的类,类里面会注入myserviceA,也就是写了切面的这个类,然后完成一系列操作

cglib动态代理与jdk动态代理的区别

如果某个类是实现了某个接口的,spring aop会使用jdk动态代理,生成一个跟你实现同样接口的一个代理类,构造一个实例对象出来,jdk动态代理,他其实是在你的类有接口的时候就会来使用

而很多时候某个类并没有实现接口,spring aop‘就会’用cglib来生成动态代理

它时生成你的类的一个子类,他可以动态生成字节码,覆盖一些方法,在方法中加入增强的代码

Spring 中的bean是线程安全的吗?

spring容器中的bean可以分为5个范围

默认情况下是singleton  每个容器中只有一个bean的实例  几乎99%的情况下都是用singleton

答案是否定的  不可能是线程安全的  如果放了实例变量  那么 会造成线程不安全   如果用的是一些线程安全的数据结构  那么是线程安全的   

因为一般不会在bean里面放实例变量

  但是大多数情况是   方法对数据库的调用   所以会有多个线程并发的访问数据库

Spring 事务实现原理   对事务传播机制的理解?

如果说我加了一个@Transactional注解,此时spring会使用AOP思想,在这个方法执行之前,就去开启事务,执行完毕之后,根据方法是否报错,来决定回滚还是提交事务

传播机制:

默认required   调用该方法时,如果没有事务 就创建事务,如果有事务就加入事务

开启一个事务

执行方法A的代码,接着再执行方法B 的代码

提交或者回滚事务

nested 嵌套事务   外层代码出错会导致内层代码回滚,但是内层代码出错只会导致内层回滚

SpringBoot核心架构?

Springboot内嵌了一个Tomcat服务器

核心是   自动装配   我们引入一个starter    它会一定程度上自动完成mybatis的一些配置和定义,不需要我们手工去做大量配置了

用了strter的话   它会自动引入一些jar包  只需要做一些非常简单的  必须的配置 它会自动帮你去进行一些配置   定义和生成一些需要的bean  不需要自己去做了

Spring核心架构?

Spring bean 的生命周期

创建+初始化一个bean->spring容器管理的bean长期存活->销毁bean(两个回调函数)

Spring中使用了哪些设计模式?

工厂 单例  代理 

其实Spring ioc 的设计模式的思想就是   它自己就是一个工厂,把所有bean实例都放在了spring容器中

spring默认来说,对每个bean都是单例模式,确保这个类在系统运行期间只有一个实例对象,只有一个bean

AOP   代理模式

如果要对一些类的方法切入一些增强的代码,会创建一些动态代理的对象,让你对那些目标对象的访问  先经过动态代理对象,动态代理对象会先做一些增强的代码,调用你的目标对象

Spring Web MVC的核心架构?

Tomcat的工作线程将请求转发给Spring mvc 框架的DispatcheServlet

DispacherServlet查找@Controller注解的controller,我们一半会给controller加上我们

@RequestMapping 的注解,标注那些controller用来处理哪些请求,此时根据请求的url,去定位到哪个controller来进行处理

根据@RequestMapping去查找,使用者controller的那个方法来进行请求的

直接调用controller进行请求处理

我们的controller方法会有一个返回值,以前一般还是走jsp,模板技术,  现在不需要渲染页面   只需要返回json

前端来做渲染

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。