Spring进阶知识
- 🍀spring基础知识
-
- ☘️什么是spring
- [☘️spring 的优缺点](#☘️spring 的优缺点)
- ☘️解释一下IOC和AOP
- [☘️IOC 和DI的区别是什么](#☘️IOC 和DI的区别是什么)
- [☘️spring 中注入对象的方式](#☘️spring 中注入对象的方式)
- ☘️自动注入的注解有哪些注解
- [☘️Spring 中的bean和new的对象由什么区别](#☘️Spring 中的bean和new的对象由什么区别)
- ☘️AOP中的术语有哪些,通知有哪些
- [☘️Spring 实现AOP有哪几种方式](#☘️Spring 实现AOP有哪几种方式)
- ☘️谈谈Spring事务管理,实现方式有几种,原理是什么?
- ☘️声明式事务哪些场景下会失效
- [🍀 Spring进阶知识](#🍀 Spring进阶知识)
-
- ☘️Bean的作用域
- [☘️BeanFactory 和ApplicationContext 的区别](#☘️BeanFactory 和ApplicationContext 的区别)
- [☘️SpringBean 的生命周期](#☘️SpringBean 的生命周期)
- [☘️Spring 中的 bean 是线程安全的吗, Servlet是线程安全的吗](#☘️Spring 中的 bean 是线程安全的吗, Servlet是线程安全的吗)
- ☘️spring中的bean循环依赖问题
- [☘️SpringBoot 自动装配原理](#☘️SpringBoot 自动装配原理)
🍀spring基础知识
☘️什么是spring
Spring是一个轻量级 的,非侵入式的IOC 和AOP 的一站式java后端框架
☘️spring 的优缺点
🍂优点:
将对象统一进行管理,为类提供额外的功能可以将一些非业务代码进行提取动态调用降低各层之间的耦合度,很好的兼容集成其他框架提高了开发效率
🍂缺点:
配置繁琐,而且很多都是模板化配置需要我们自己提供一些组件的依赖(jar)
☘️解释一下IOC和AOP
🍂IOC 控制反转
就是将在程序中创建对象的控制权反转给spring框架统一管理.
注:spring如何管理: 负责对象的创建(实例化),初始化,对象之间的依赖关系,功能的增强,对象销毁,整个的生命周期进行管理.
🍂AOP 面向切面编程
aop是将程序中的非业务代码进行抽取,将非业务代码与业务代码相隔离,耦合度降低.然后通过一个代理对象在业务代码中调用非业务代码,提高代码的灵活性,提高了开发效率.
☘️IOC 和DI的区别是什么
🍂 Spring IOC(控制反转)是一种设计模式,是Spring框架的核心,它通过将对象之间的依赖关系交由容器来管理和注入,实现了组件之间解耦、松耦合的目的.
🍂Spring DI(依赖注入)是Spring框架中的一个核心特性,它是实现控制反转(IOC)的具体方式之一。DI指的是通过外部配置或注解的方式,将一个对象所依赖的其他对象(依赖)自动注入到该对象中,而不需要在代码中显式地创建和管理这些依赖对象。
☘️spring 中注入对象的方式
1.Xml配置方式依赖注入2.注解方式注入属性
☘️自动注入的注解有哪些注解
@Autowired,@Resource,@Inject
☘️Spring 中的bean和new的对象由什么区别
Bean和new但是创建对象,但是Bean所创建的对象会集中放在一个容器中方便管理
☘️AOP中的术语有哪些,通知有哪些
🍂连接点:
类中可以被增强的方法(例如新增,修改...)
🍂切入点:
实际被增强了的方法
🍂通知:
方法被增强的功能(日志,事物,权限验证...) 通知可以分为 前置通知,后置通知,异常通知,最终通知,环绕通知
🍂 切面(Aspect):
把通知添加到切入点的整个过程称为切面
🍂目标(Target):
代理的目标对象(连接点,切入点所在类),真正做这件的事的类
🍂代理(Proxy):
向目标对象应用通知时创建的代理对象, 代理对象,帮助我们调用通知的那个对象
☘️Spring 实现AOP有哪几种方式
基于注解方式的实现,基于aspectj的xml配置方式实现
☘️谈谈Spring事务管理,实现方式有几种,原理是什么?
Spring 声明式事物管理方式有两种:
🍂基于xml配置
🍂基于注解实现
☘️声明式事务哪些场景下会失效
🍂@Transactional 应用在非 public 修饰的方法上
异常被catch捕获导致失效出现编译期异常
🍂@Transactional 事务传播行为设置错误
数据库引擎不支持事务同一个类中,使用非代理对象调用一个有事务的方法,导致事务错误
🍀 Spring进阶知识
☘️Bean的作用域
singleton :
单例 默认 一个类只创一个bean
prototype :
原型 获取一次 创建一次
request :
一次http请求中创建一个
session :
一次会话(浏览器建立与服务器的连接后,到浏览器关闭)
☘️BeanFactory 和ApplicationContext 的区别
BeanFactory和ApplicationContext都是spring框架中提供的接口,BeanFactory接口是spring容器中最底层(顶层)的接口,是面向spring框架,很多的内部的工厂类都实现该接口.ApplicationContext 接口继承了BeanFactory接口是面向应用程序,提供额外的功能
注:实现了BeanFactory接口的工厂类,在使用某个对象时,才会去创建初始化
注:实现了ApplicationContext接口的工厂类,在程序启动时就会创建初始化
☘️SpringBean 的生命周期
🍁1.实例化 创建一个基本的对象(没有增强的对象)
🍁2.属性注入/赋值 为对象中关联的对象赋值
🍁3.初始化
检测我们的类是否实现某些接口,如果实现了,就会执行相应的方法,aop额外功能的增强也是在初始化环境中进行的.
🍁4.将对象放入到容器中 使用
🍁5.销毁
☘️Spring 中的 bean 是线程安全的吗, Servlet是线程安全的吗
🍁原型bean:
每次都会创建一个新的bean对象,没有共享变量(线程安全)
🍁单例bean:
对于单例Bean,所有线程都共享一个单例实例Bean
🍁bean又分为:
有状态就是有数据存储功能(例如包含成员变量)
无状态就是不会保存数据
注:只有有状态的单例bean才会有线程安全问题
使用ThreadLocal,为每个线程创建一个变量副本可以解决线程安全问题
☘️spring中的bean循环依赖问题
由于spring中使用@Autowired注解标签进行自动注入,如果不加以处理,会出现循环依赖问题 即 创建A bean对象时,需要注入B bean对象, 就去创建 B bean对象,需要注入A bean对象
spring中如何解决循环依赖问题:
🍁spring中内部有3个map存储不同阶段的对象(三级缓存)
1.一级缓存(singletonObjects) 放的是初始化完成的bean
2.二级缓存(earlySingletonObjects) 放是没有初始化完成的半成品bean
3.三级缓存(singletonFactories) 放的用来创建初始化某个bean的工厂对象
🍁 解决过程 :
1.创建并初始化A,
2.需要B,先去一级缓存找,一级缓存没有,把半成品的A放入到二级缓存,工厂放到3级缓存
3.创建并初始化B,需要A,就从二级缓存中找到半成品A,注入A.
4.Bean B初始化完成,放到一级缓存
5.给A注入
☘️SpringBoot 自动装配原理
🍁自动装配基本流程概述
springBoot 启动时,首先对application.yml 和pom.xml 文件进行读取,获取到项目中使用到的第三方组件,然后读取spring.factories中的spring支持的配置类,最后加载项目中所使用到的组件配置类
🍁注解层面梳理: