请你说说Spring

一. Spring是什么?

  • 是一个轻量级的开源容器框架,用来装JavaBean,可以把其他的一些框架进行整合使用,使得开发更快,更简洁。
  • 轻量级:占用空间小,非入侵式的(Spring中的对象不依赖于Spring的特定类)
  • IOC,AOP

二. IOC和AOP

谈谈你对AOP的理解?

  • 将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,注入到目标对象(具体业务) 中。可以在不改变目标对象的前提下进行功能扩展,做一些额外的事。
  • 在OOP的设计中,导致了大量代码的重复,不利于模块的重用。
  • AOP基于动态代理:JDK动态代理和cglib动态代理

Spring通知(Advice)有哪些类型?

  • 前置通知,后置通知,循环通知,返回后通知,抛出异常后通知

谈谈你对IOC的理解?

从三个方面谈:

  • 容器概念:
  • IOC容器就像个map一样,里面保存的是对象。这些对象通过xml,或者注解放到这个map中, 在需要的地方进行DI注入。
  • 对象的创建,消亡,管理都交给容器。
  • 控制反转:(获得依赖对象的过程被反转了)
  • 没有IOC之前,比如A对象中依赖B对象,那么在A运行到某一点,就会主动的创建B对象或者使用之前创建的B对象,不管怎样,控制权在程序的手里。引入IOC之后,对象A和B之间失去了 直接的联系,当对象A允许到需要B对象的时候,IOC会把之前创建的B对象注入到需要的位置B对象从主动创建到被动注入,控制权交给IOC
  • 依赖注入:
  • 就是实现IOC的方法,在IOC容器允许中,动态的将某种依赖关系注入到对象中

三. 简述一下Spring Bean的生命周期?
四. 解释一下Spring支持的几种Bean的作用域?

  • singletion:单例模式(默认) 每一个IOC容器只有一个bean对象,生命周期与IOC容器一样
  • prototype:原型模式,每次注入都会创建一个新的对象(每次调用getBean()创建一个新的对象)

其余的只能在web开放中使用!(让对象和web里的作用域一样)

  • request:每次请求创建一个对象
  • session:每个session中创建一个对象
  • application:每一个ServletContent中创建一个对象
  • websocket:每一个websocket中创建一个对象
  • global-session:全局作用域(了解)

Spring框架中的单例Bean是线程安全的吗?

不是线程安全的

  • 如果bean是无状态的,就不会保存数据。只是说一层一层的调用实例方法,比如controller调用 service,service调用dao。这样的操作是在栈中,每一个线程独有的空间,就是线程安全的。
  • 如果bean是有状态的,就会有数据存储功能。那么数据保存在堆中,就需要考虑线程安全问题了
  • 两种方式保证线程安全:

    • 把singletion改为prototype。每次是新的对象
    • 使用Threadlocal把变量变为线程私有的,如果需要共享变量,加锁。

五. Bean的自动装配

什么是Bean的自动装配,有哪些方式?

通俗的话来讲,就是一个Bean中。有些属性是引用类型的,这些类型就不需要手动注入,可以从IOC容器中自动注入,也就是自动装配。具体是给autowire的属性赋值。

五种自动装配的方式?

  • 缺省:就是手动注入
  • byType:根据类型注入
  • byName:根据id注入
  • construtor:根据构造器的参数类型进行注入。
  • autodetect:先根据构造器参数,再根据byType。

关于@autowire

自动注入俩种方式:

  • xml配置文件
  • 注解:
  • @autowired
  • @Resource

关于@autowired的理解?

  • 该注解是先ByType再ByName。可以放在属性,setter方法,构造器,任意方法上使用因为该注解使用反射进行注入。
  • 它会先把 属性/成员变量的【访问控制检查】关掉,这样就算设置为private也会注入成功。

六. BeanFactory,ApplicationContext,FactoryBean

BeanFactory和ApplicationContext的区别?

  • BeanFactory是Spring框架的基础设施,面向 Spring 本身;
  • ApplicationContext面向使用Spring 框架的开发者,几乎所有的应用场合我们都直接使用ApplicationContext而非底层的BeanFactory。
  • ApplicationContext 由 BeanFactory 派生而来,提供了更多面向实际应用的功能。

具体区别:

  • ApplicationContext:
  • 继承MessageSource,支持国际化
  • 统一的资源文件访问方式
  • 同时加载多个配置文件
  • 载入多个上下文对象,使得每个上下文对象专注于一个特定的层次,比如:service层 (以上为扩展的功能)
  • 在容器启动的时候,一次性创建所有的bean对象,这样在容器启动的时候,就能发现错误
  • BeanFactory:
  • 采用延迟加载的形式创建bean,只有调用getBean()的时候,才进行对象的创建

FactoryBean 与 BeanFactory 有什么区别?

  • BeanFactory 是 IoC 底层容器,提供了 bean 的管理
  • FactoryBean 是创建 Bean 的一种方式,帮助实现复杂的初始化逻辑。 比如SqlSessionFactoryBean就是继承 FactoryBean

七. Spring事务

事务这个概念是数据库层面的,Spring只是基于数据库做了扩展,提供简单的操作事务的方式

Spring事务的实现方式和原理?

两种实现方式:

  • 编程式:自己关闭sql的自动提交,进行try-catch-final。
  • 申明式:采用xml或者@Transaction 开启事务
  • 申明式事务的原理:Spring会基于这个类生成一个代理对象,使用这个代理对象的时候,如果方法上使用@Transaction,就会把自动提交设置为false,然后执行逻辑,如果报异常,回滚,无异常,提交事务。

事务的传播特性

如果没有,就开启一个事务;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)

如果没有,就开启一个事务;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,方法B会起一个新的事务,等待方法B的事务完成以后,方法A才继续执行)

如果没有,就开启一个事务;如果有,就在当前事务中嵌套其他事务

如果没有,就以非事务方式执行;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)

如果没有,就以非事务方式执行;如果有,就将当前事务挂起,(方法A所在的事务就会挂起,而方法B以非事务的状态运行完,再继续方法A的事务)

如果没有,就以非事务方式执行;如果有,就抛出异常。

如果没有,就抛出异常;如果有,就使用当前事务

Spring 事务什么时候会失效?

Spring事务的原理是AOP,进行切面增强,那么失效的原因也是AOP不起作用,常见情况如下:

  • 发生自调用,使用this调用本类的方法,此时这个this对象不是代理类,而是UserService 对象本身!
  • 解决方式很简单,让this变为代理类
  • 方法不是public的:
  • @Transaction只能使用在public方法上,否则事务会失效
  • @Transactional 作用于接口,使用 CGLib 动态代理
  • 数据库不支持事务
  • 没有被Spring管理
  • 异常被吃掉,事务没有回滚

八. Spring中用到哪些设计模式
九. 循环依赖

后期更新~

寄语:透过云端的道路,只亲吻攀登者的足迹。

Original: https://www.cnblogs.com/monkey-xuan/p/15905335.html
Author: 小猴子_X
Title: 请你说说Spring

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/579526/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 彻底消灭if-else嵌套

    一、背景 1.1 反面教材 不知大家有没遇到过像 横放着的金字塔一样的 if-else嵌套: if (true) { if (true) { if (true) { if (tru…

    Java 2023年6月5日
    088
  • Mysql 5.7开启binlog日志

    Mysql 5.7开启binlog日志 前言 binlog是MySQL的二进制日志,并且是MySQL中最重要的日志。binlog记录了对MySQL数据库执行更改的所有操作,包括对数…

    Java 2023年6月15日
    092
  • java密码安全=学习笔记

    https://blog.csdn.net/hancoder/article/details/111464250 Original: https://www.cnblogs.com…

    Java 2023年5月29日
    087
  • VMware虚拟机中安装Linux操作系统(ubuntu)

    一、准备工作: 1、下载VMware虚拟机 下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-…

    Java 2023年6月9日
    073
  • webpack快速入门(一):安装

    webpack入门系列,从安装到使用再到放弃。。。。全套的哟,呵呵 首先说明,我是一个后端开发,好几年没碰过前端了,想当年写前端的时候jq还是主流,那时的前端还单纯的像个处女一样,…

    Java 2023年6月16日
    071
  • (九)、SpringBoot整合Swagger2、Swagger3

    (九)、SpringBoot整合Swagger2、Swagger3 一、整合 Swagger2 1、maven 依赖: io.springfox springfox-swagger…

    Java 2023年5月29日
    0125
  • 来测试下你的Java编程能力

    上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看…

    Java 2023年5月29日
    083
  • 【转】Java之WeakReference与SoftReference使用讲解

    Java 2 平台引入了 java.lang.ref 包,其中包括的类可以让您引用对象,而不将它们留在内存中。这些类还提供了与垃圾收集器(garbage collector)之间有…

    Java 2023年5月29日
    076
  • 哈工大软件构造Lab1(2022)

    目录 一、实验目标概述 二、实验环境配置 1、安装编写java程序的IDE——IntelliJ IDEA 2、安装Git 3、安装Junit 4、GitHub Lab1仓库的URL…

    Java 2023年6月9日
    096
  • 设计模式-day05

    6,行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态,一个电梯有开门状态,关门状态,停止状态,运行状态。每一种状态改变,都有可能要根据其他状态来更…

    Java 2023年6月13日
    056
  • MSSQL中UPDATE与 INNER JOIN联用的语法结构

    | 0.16分钟 | 267.2字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/4/30 PM9:36 | 系列 | 已完成…

    Java 2023年6月5日
    085
  • Windows Server 2012上安装.NET Framework 3.5

    工具提取( NET3.5安装包 提取码: a123)–来自百度网盘超级会员v4的分享 1.首先,先下载NET 3.5安装包,然后解压到想要安装的位置(比如:C盘下的WIN2012R…

    Java 2023年6月5日
    093
  • java 常用的几种集合类总结

    一:直观框架图 简单版: 详细版: posted @2022-07-25 07:40 锐洋智能 阅读(16 ) 评论() 编辑 Original: https://www.cnbl…

    Java 2023年5月29日
    092
  • java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment

    请求验证码时后台报错:java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsE…

    Java 2023年5月29日
    0136
  • 【spring-boot】Mybatis Generator 如何生成Example类

    我发现上传到github上的项目,有的有Example类,有的没有Example类,怎么回事呢? 对比项目,发现/src/main/resources/mybatis/genera…

    Java 2023年5月29日
    075
  • 软件工程-就几个方面谈谈做项目和做产品的区别

    从严谨的角度触发,应该基本按照同样的标准实现项目和产品。 很可惜,在实际工作中,这基本上是不太可能的,除非项目比较大,客户要求比较严格。 本文主要谈以下几点: 1、需求差异 2、实…

    Java 2023年6月9日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球