您现在的位置是:首页 >技术杂谈 >spring底层原理 IOC与AOP网站首页技术杂谈
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
前端来做渲染