栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring】Spring基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring】Spring基础

Spring 基础

文章目录
  • Spring 基础
  • 一、Spring Bean的作用域
  • 二、Spring Bean 的生命周期
  • 三、Spring是怎么解决循环依赖的
  • 四、Spring 常见注解
  • 五、Spring AOP
  • 六、Spring的事务管理机制
  • 七、Spring 事务失效
  • 八、Spring控制反转 IOC
  • 九、SpringBoot启动流程


一、Spring Bean的作用域

Spring框架支持以下五种bean的作用域:

  • singleton : 单例模式。
  • prototype:多例模式。
  • request:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
  • session:每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
  • global-session:全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义。

注意: 缺省的Spring bean 的作用域是Singleton。使用 prototype 作用域需要慎重的思考,因为频繁创建和销毁 bean 会带来很大的性能开销。

二、Spring Bean 的生命周期

Spring Bean的生命周期可以简化为4个步骤:实例化 -> 属性赋值 -> 初始化 -> 销毁

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction
三、Spring是怎么解决循环依赖的

首先什么是循环依赖?假设类A当中存在成员变量B,而B中也有成员变量A,那就出现了循环依赖,对Spring来说,应该按什么顺序来进行查 u 你更加创建对象呢?

Spring 解决循环依赖的问题,是通过三级缓存来处理的,通过三级缓存提前拿到未初始化的对象。

  • 一级缓存:用来保存实例化、初始化都完成的对象。
  • 二级缓存:用来保存实例化完成,但是未初始化完成的对象。
  • 三级缓存:用来保存一个对象工厂,提供一个匿名内部类,用于创建二级缓存中的对象

注意:先说明前提:原型(Prototype)的场景是不支持循环依赖的. 单例的场景才能存在循环依赖

四、Spring 常见注解

@Autowired和@Resource之间的区别:

@Autowired 默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
@Resource 默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。

五、Spring AOP

AOP实现的关键在于代理模式,AOP代理主要分为静态代理和动态代理

什么是代理?可以理解为将 Advice 应用于目标对象后创建的对象。
Advice + Target Object = Proxy

  1. 静态代理的代表 :AspectJ;

AspectJ是静态代理的增强,所谓静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强,他会在编译阶段将AspectJ(切面)织入到Java字节码中,运行的时候就是增强之后的AOP对象

  1. 动态代理的代表:Spring AOP

Spring AOP 使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法 。

  1. JDK动态代理和CGLIB动态代理的区别
    JDK动态代理只提供接口的代理,不支持类的代理。
    CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。

注意:CGLIB是通过子类继承的方式实现代理的,如果该类是Final修饰的话,是无法实现代理的。
Spring默认使用JDK动态代理,如果业务对象没有实现任何接口那么默认使用CGLIB。

  1. Spring中有哪些不同的通知类型

前置通知 @Before:在目标方法被调用之前调用通知功能;
后置通知 @After:在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
返回通知 @AfterReturning :在目标方法成功执行之后调用通知;
异常通知 @AfterThrowing:在目标方法抛出异常后调用通知;
环绕通知 @Around:通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

  1. AOP的常见术语:
  • 连接点(Join point):连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。
  • 切入点(Pointcut):切点,属于过滤器的一种实现,匹配过滤哪些类哪些方法需要被切面处理,包含一个ClassFilter和一个MethodMatcher,使用PointcutAdvisor定义时需要
  • 引入(Introduction):引入允许我们向现有类添加新方法或属性
  • 织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。在目标对象的生命周期里有多少个点可以进行织入:编译期(AspectJ)、类加载期(AspectJ5)、运行期(Spring AOP)

SpringAOP实现的大致思路:
1.配置获取Advisor :拦截器+AOP匹配过滤器,生成Advisor
2.生成代理:根据Advisor生成代理对象,会生成JdkDynamicAopProxy或CglibAopProxy
3.执行代理:代理类执行代理时,从Advisor取出拦截器,生成MethodInvocation(连接点)并执行代理过程

六、Spring的事务管理机制
  • Spring 使用AOP实现声明式事务。
  • Spring事务的本质其实就是数据库对事务的支持,它不是脱离数据库实现的,它只是为不同的事务API 如JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
  • Spring的事务传播行为:

① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
③ PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。

七、Spring 事务失效
  • 抛出检查异常导致事务不能正确回滚。Spring 默认只会回滚非检查异常
  • 业务方法内自己 try‐catch 异常导致事务不能正确回滚。
  • 非 public 方法导致的事务失效:Spring 为方法创建代理、添加事务通知、前提条件都是该方法是 public 的。
  • 调用本类方法导致传播行为失效:本类方法调用不经过代理,因此无法增强 。解法1:依赖注入自己(代理)来调用 解法2:通过 AopContext 拿到代理对象,来调用 。
八、Spring控制反转 IOC

Spring 中的 IoC 的实现原理就是 :工厂模式 + 反射机制
IOC本质就是Bean的生命周期交由容器进行管理,实现解耦。

九、SpringBoot启动流程

springboot启动流程:

  1. 创建SpringApplication对象,然后在构造方法里初始化一些属性。
  2. 实例化之后执行run方法主体,run执行流程是基于观察者模式的,整个SpringBoot的启动流程就是各种事件的发布。获取并启用监听器ApplicationListener,并发布应用启动事件SpringApplicationRunListener
  3. 准备环境变量
  4. 创建应用程序的上下文createApplicationContext()
  5. 去spring.factories文件加载异常报告器SpringBootExceptionReporter
  6. 准备上下文环境prepareContext(这一步会执行初始化方法,其实就是执行实现了ApplicationContextInitializer 接口的类)
  7. 刷新上下文refreshContext,主要是自动装配和启动 tomcat
  8. 刷新上下文后置处理afterRefresh,空方法
  9. 发布上下文准备就绪事件
  10. 执行自定义的run方法。ApplicationRunner和CommandLineRunner
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/847091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号