Spring
Spring IOC的原理?
Spring IOC(控制反转)是Spring框架的核心特性之一,原理就是通过容器管理Bean的生命周期和依赖关系,实现了应用程序组件之间的解耦,简化了应用程序的开发和维护。
1. Bean定义:在Spring IOC容器中,所有的组件都被称为Bean。每个Bean都有一个对应的Bean定义,它包含了Bean的配置元数据,比如类的全限定名、依赖关系、初始化方法、销毁方法等信息。
2. 容器管理:Spring IOC容器负责管理Bean的生命周期和依赖关系。容器在启动时读取Bean定义,然后根据定义创建Bean的实例,并在需要时注入依赖关系。
3. 依赖注入:依赖注入是Spring IOC的核心机制。通过依赖注入,容器在创建Bean的实例时,自动将其依赖的其他Bean注入进来。这样,Bean之间的依赖关系由容器负责管理,而不是由Bean自己去查找或创建依赖的对象。
4. Bean的生命周期管理:Spring IOC容器负责管理Bean的生命周期,包括Bean的创建、初始化、使用和销毁。通过配置初始化方法和销毁方法,可以在Bean的生命周期的不同阶段执行相应的操作。
5. 解耦应用程序:通过IOC容器管理Bean的依赖关系,应用程序的各个组件之间的耦合度大大降低。这样,可以更容易地进行单元测试、模块替换和系统升级。
Spring AOP 原理?
Spring AOP(面向切面编程)通过在运行时动态地将横切逻辑(如日志记录、性能统计、安全控制等)插入到应用程序的特定位置来实现特定的功能。通过AOP,可以将横切逻辑与业务逻辑分离,提高了代码的可维护性和可重用性。底层原理:
1. 代理模式:当一个Bean被AOP代理后,调用该Bean的方法时,实际上是调用了代理对象的方法。代理对象在方法执行前后可以执行额外的横切逻辑,比如记录日志、检查权限等。
2. 切点(Pointcut):定义了在哪些连接点(方法调用、字段访问等)上可以应用横切逻辑
3. 通知(Advice):定义了在连接点上执行的具体操作,比如在方法执行前后执行的操作。Spring AOP提供了几种不同类型的通知,包括前置通知、后置通知、环绕通知等。
4. 织入(Weaving):将横切逻辑应用到目标对象中,并创建最终的代理对象的过程。
spring bean的生命周期?
区别于普通的 Java 对象需要通过 new 创建对象,Spring 的 Bean 由 IoC 容器进行实例化、组装以及管理。
Spring 容器只能管理 单例(singleton) 作用域的 Bean 的完整生命周期,对于 原型(prototype) 作用域的 Bean,Spring 容器只创建 bean 的实例后便会返回给用户,剩余的生命周期由用户控制。所以 Bean 的生命周期主要指的是 singleton 作用域 的 Bean。
Bean 的生命周期主要包括四个部分:
- 实例化
- 属性赋值
- 初始化
- 销毁
循环依赖有哪些场景?如何解决?
循环依赖的场景:
循环依赖是指对象实例之间依赖关系构成一个环形,分为:单个对象的自我循环、两个对象的相互循环、多个对象的相互循坏。
循环依赖可能造成实例初始化失败:
spring已经默认解决了循环依赖,只要在spring的规范下使用,即使出现了循环依赖,项目也是可以正常启动。主要是依靠spring内部的三级缓存实现的:
- singletonObjects:一级缓存,保存成熟Bean
- earlySingletonObjects:二级缓存,用于保存不成熟的Bean,如依赖对象没有完成初始化。
- singletonFactories:三级缓存,保存代理的Bean。
无论是对象实例化还是依赖注入,都是在缓存中逐级寻找,先找一级,再找二级,再找三级,三级缓存都没有bean时才会创建。
但spring无法解决所有的循环依赖,比如生成代理对象产生的循环依赖、构造器循环依赖。
循环依赖的解法:
1. 使用@Lazy注解,构造器增加 @Lazy 注解后,Spring不会去初始化参数对应类的实例,而是返回它的一个代理对象,解决了循环依赖问题。
2. 最好的解决循环依赖问题的方案是从代码设计上进行规避,但复杂系统中有难以避免。
Spring Boot
springboot的自动装配原理?
什么是装配?
Spring最核心的功能是IOC,也就是Bean的管理,我们把Bean对象托管到Ioc容器的过程称为装配。但传统Spring开发涉及繁琐的XML配置。
什么是自动装配?
SpringBoot的自动装配(Auto-configuration)可以根据应用程序的依赖和配置,自动完成大部分配置工作,减少了开发者手动配置的工作。
自动配置的过程:
- SpringBoot启动后扫描 META-INF/spring.factories 文件,获取所有自动配置类的全限定名,然后根据项目的依赖关系和配置信息,加载相应的自动配置类,生成相应的Bean对象,然后将它们交给ioc容器来帮我们进行管理。
- 比如你想要在项目中使用mybatis-plus的话,直接在项目中引入对应的 starter 即可。
解释
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency>
- 引入 starter 之后,我们通过少量注解和一些简单的配置就能使用第三方组件提供的功能了。
SpringMVC
SpringMVC的原理?
- SpringMVC是基于MVC模式的Web框架
- 核心组件是DispatcherServlet,它负责接收请求,并将请求分发到不同的控制器。
- 控制器处理请求,并返回ModelAndView对象。
- DispatcherServlet根据ModelAndView对象中的视图名称,将请求转发到相应的视图,最后将视图渲染给用户。
spring、springboot、springmvc区别?
① Spring
Spring是一个轻量级的开源框架,核心作用:简化java开发,比如:
- IOC:Inverse of Control,控制反转,原本程序手动创建对象的控制权,交由Spring框架来创建。当需要创建对象时,只需要配置好配置文件或注解即可。
- AOP:Aspect-Oriented Programming,面向切面编程,能够将那些与业务逻辑无关的公共逻辑(日志管理、权限控制等)封装起来,减少重复代码,降低模块间的耦合度。
② SpringMVC
SpringMVC属于SpringWeb里面的一个功能模块,基于MVC模式,专门用于开发Web项目。
③ SpringBoot
SpringBoot包含了Spring的核心:IOC和AOP,并在Spring的基础上进行功能扩展,用于简化Spring应用的开发,使开发、测试和部署更加方便,比如:
- 搭建项目快:几秒钟就可以搭建完成1个完整的项目
- 部署项目快:SpringBoot内嵌各种servlet容器,如:Tomcat、Jetty等,只要将项目打成一个可执行的jar包,就能在本地快速独立运行。
- 简化配置:根据引入的jar包,对项目进行自动配置,免去Spring繁琐的配置过程
三者的关系:spring mvc ∈ spring ∈ spring boot
Spring Cloud
什么是Spring Cloud?常用组件有哪些?
Spring Cloud是基于Spring Boot实现的微服务系统架构的一站式解决方案,包含一些列服务发现注册、配置中心、负载均衡、网关、数据监控等组件,可以帮助我们快速搭建一套微服务系统。