前言

作为一个写Java的程序员,应该不太可能没听过Spring。对开发者来说,Spring就像是哆啦A梦的口袋。无论需要什么道具,都可以从口袋里直接拿出来,而不用关心这些道具来自哪里。

本篇主要记录一些关于Spring的基础知识,用于快速查找和回顾不适合作为Spring的入门学习(头铁的旁友随意)。

核心

Spring的两大核心当属IOCAOP

IOC

IOC是控制反转(Inversion OControl),IOC是一种编程思想。Spring的IOC容器实现了IOC,是Spring框架的基本功能,管理着Spring应用中bean的创建配置管理。Spring的IOC容器接管了应用中的bean,能够自动解决bean与bean之间的依赖。

传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。因此反转是指:依赖对象的获取被反转了。

IOC容器对使用者来说就像是一个黑盒,不需要关心bean之间的依赖是怎样的,大大减少了编程的难度。

IOC的实现方式有两种:依赖注入(Dependency Injection,DI)和依赖查找(Dependency Lookup,DL)

  • 依赖注入:应用程序被动的接收对象,bean实例化的时候,IOC容器会自动根据类型或者名称,把依赖的其他bean注入给当前bean。依赖注入的方式主要有以下四种:

    • 注解:通过注解来让IOC容器注入所依赖类型的对象,例如最常用的@Autowired
    • 构造方法:实现对应参数的构造方法,在创建对象时来让IOC容器注入所依赖类型的对象。
    • setter方法:实现对应属性的setter方法,来让IOC容器注入所依赖类型的对象。
    • 接口:实现特定接口以,让IOC容器注入所依赖类型的对象。
  • 依赖查找:依赖查找是容器中的对象,通过容器的API,来查找自己所依赖的资源和对象。相比于依赖注入依赖查找是一种更加主动的方式。

AOP

AOP(Aspect-Oriented Programming)即面向切面编程,是一种完全不同于OOP的编程思想。AOP不是用来取代OOP的,反而是来补充OOP的。

OOP的思想把项目分为层次结构,是一种从上到下的结构。这种上下结构想要做到从左到右是一件非常繁琐的事。这种从左到右的需求往往是一些诸如日志安全事务等,非业务性的功能。这样的功能如果按照OOP的思想来实现,就会导致大量冗余、侵入性强的代码。所以AOP的作用就是剥离一些非业务代码,做到统一管理。

AOP的功能就是在运行时,把指定的代码动态的加入到指定的地方,来完成一些非业务逻辑的功能,从而避免手动编写这些代码。

AOP往往采用动态代理的方式来实现。

作用域

Spring bean的作用域主要有五种:

  • singleton:在整个Spring IoC容器仅存在一个Bean实例,Bean以单例方式存在。singleton是Spring的默认配置。
  • prototype每次从Spring IoC容器中获取Bean时,都返回一个新的实例
  • request:每次HTTP请求都会创建一个新的Bean实例。该作用域仅适用于Spring构建的web环境。
  • session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean。该作用域仅适用于Spring构建的web环境。
  • application:限定一个Bean的作用域为整个web应用。该作用域仅适用于Spring构建的web环境。

实例化

Spring中的bean的实例化主要有三种方式

  • 无参构造方法,这种方式最常用
  • 使用静态工厂
  • 使用实例工厂

注入方式

属性的注入有两种方式:byTypebyName

  • byType:如果容器中存在一个与指定属性类型相同的bean,那么将该属性自动装配。
    比如在Controller注入Service

    private IUserService userService

    byType方式会自动注入IUserService的实现类UserServiceImpl,如果实现类有多个,默认会抛出异常。下文讲述如何解决。

  • byName:通过属性名称自动装配。
    比如在Controller注入Service

    private IUserService userService

    通过byName的方式需要指定实现类UserServiceImplName

    @Service("userService")
    public class UserServiceImpl implements IUserService {...}

事务隔离级别

Spring提供了五种隔离级别:

  • DEFAULT(默认):意思就是数据库用啥我用啥
  • SERIALIZABLE(串行化):事务之间以一种串行的方式执行
  • REPEATABLE READ(可重复读):是MySQL默认的隔离级别,同一个事务中相同的查询会看到同样的数据行
  • READ COMMITED(读已提交):一个事务可以读到另一个事务已经提交的数据
  • READ UNCOMMITED(读未提交):一个事务可以读到另一个事务未提交的数据

除了第一个是Spring新增的,其余的四个都是和数据库的事务隔离级别一一对应

事务传播机制

事务传播机制是指在一个可能含有事务的方法中,调用了另一个可能含有事务的方法,这两个事务应该如何去取舍。最常见的场景就是在Service层。比如OrderService#createOrder()方法里调用了StockService#decreaseStock(),而这两个方法明显都是有事务的。这时,两个事务如何相互影响就是事务传播机制。

Spring提供了七种事务传播机制:

  • REQUIRED:Spring默认值,如果存在事务,则加入当前事务;如果没有事务,则开启一个新的事务。
  • REQUIRES_NEW:如果当前存在事务,把当前事务挂起,新建事务。
  • SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  • MANDATORY:如果当前存在事务,则加入当前事务;如果没有事务,就抛出异常。
  • NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:支持当前事务,新增Savepoint,与当前事务同步提交或回滚。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

生命周期

Spring管理了对象的生命周期,所以有必要了解Spring到底是怎么管理bean的生命周期的。如果我们想要在bean生命周期的某个时刻执行特定的功能应该怎么办?

Spring bean的生命周期颇为复杂,以下是整个过程,参考org.springframework.beans.factory.BeanFactory

常用注解

标识类

  • @Component:标识此类由Spring IOC容器管理
  • @Controller:标识此类是接收和转发请求用的Controller类,是@Component的细化注解
  • @Service:标识此类是处理业务逻辑的Service类,是@Component的细化注解
  • @Repository:标识此类是处理持久化操作相关的类,通常是XxxDao,是@Component的细化注解

注入类

  • @Autowired:属于Spring,是根据类型(byType)的方式自动注入属性,默认是必须的。如果要设置成可选,需要把required设置成false

    @Autowired(required = false)
    private IUserService userService;

    如果IUserService的实现类不止一个,默认会报错。需要配合注解@Qualifier指定具体的实现类

    public interface IUserService {
    }@Component("helloUserService")
    public class HelloUserServiceImpl implements IUserService {
    }@Component("worldUserService")
    public class WorldUserServiceImpl implements IUserService {
    }

    正确注入方式

    @Autowired
    @Qualifier("helloUserService")
    private IUserService userService;
  • @Qualifier:见@Autowired

  • @Resource属于JDK,默认是按照名称(byName)进行装配的。

    • 如果没有指定name属性,默认取字段的名称作为bean名称寻找依赖对象。
    • 如果没有指定name属性,且byName的方式无法装配,则会按照byType的方式进行装配。
    • 如果仅指定的type属性,也会通过byType的方式进行装配,找不到或者找到多个都会抛异常。
    • 只要指定了name属性,就不会再按照byType的方式进行装配。
  • @Value:用于注入一些配置文件中的常量,如jdbc相关的配置等

web相关

  • @RequestMapping:这个注解会将HTTP请求映射到Controller的处理方法上。

    // 简单用法
    @RequestMapping("/index")// 映射多个url
    @RequestMapping({"/index", "/home"})// 限制请求方式为Post,等同于注解 @PostMapping("/index")
    @RequestMapping(value = "/index", method = RequestMethod.POST)
  • @RequestBody:将HTTP请求正文插入方法中,用来处理请求的Content-Type不是application/x-www-form-urlencoded(表单)编码的内容,例如:application/jsonapplication/xml等。也就是说当客户端向后台提交数据不是以表单,而是以JSON数据的方式时,可以使用@RequestBody注解将数据映射到后台参数列表

    // 前端
    $.ajax({type: 'POST',dataType: "json",contentType: "application/json; charset=utf-8",data: JSON.stringify(paramJson),url: "",success: function (data) {}
    });// 后台
    @RequestMapping("/xxx")
    public Sring xxx(@RequestBody UserDTO userDTO) {return "success";
    }
  • @RequestParam:用来辅助绑定特殊要求的参数

    // 表示该接口必须传递参数id
    @RequestMapping("/xxx")
    public String xxx(@RequestParam("id") String id) {return "";
    }// 参数id可以不传
    @RequestMapping("/xxx")
    public String xxx(@RequestParam(name = "id", required = false) String id) {return "success";
    }
  • @PathVariable:表示将url中的参数变量绑定到参数列表

    // 将参数列表中的值自动填充到url中的变量中
    @RequestMapping("/order/{orderId}")
    public String xxx(@PathVariable String orderId) {return "success";
    }// 如果参数列表中的参数名和url中的不一致,则需要指定@PathVariable的name属性
    @RequestMapping("/order/{orderId}")
    public String xxx(@PathVariable(name = "orderId") String id) {return "success";
    }
  • @ResponseBody:表示该方法的返回的结果直接写入 HTTP 响应正文中,而不是跳转到某个路径,一般用于向客户端返回JSON数据。

    // 把success字符串返回给客户端
    @ResponseBody
    @RequestMapping("/xxx")
    public String xxx() {return "success";
    }

SpringMVC请求过程

一图胜千言

总结

本篇主要列举了与Spring相关的一些基础知识,包括IOC、AOP、bean的作用域、生命周期、事务传播机制、常用注解等。了解了这些基础知识,能帮助我们更好的使用Spring。

作者:Sicimike
原文链接:https://blog.csdn.net/Baisitao_/article/details/105151646

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

完整版获取:狂戳这里免费领取~

《Java高级面试》

《Java高级架构知识》

《算法知识》

e/details/105151646

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

完整版获取:狂戳这里免费领取~

《Java高级面试》

[外链图片转存中…(img-lGg7fInO-1623732887677)]

《Java高级架构知识》

[外链图片转存中…(img-50e1AIS9-1623732887679)]

《算法知识》

十分钟就能回顾Spring常问的知识点,带你突击面试没问题!相关推荐

  1. 那些年Android面试官常问的知识点,分享一点面试小经验

    开头 年前面试了一些公司,目前已经拿到了阿里跟头条的 offer.去年我也出去找工作了,面试五家拿到了四家公司的 offer.所以在面试方面我应该可以提供一些愚见吧.本篇会讲解一些常见题目以及一些答题 ...

  2. Spring常问面试题及答案汇总(2022版)

    网上也有很多关于Spring常问问题/面试题整理的文章,我感觉大部分都是互相 copy,而且很多问题也不是很好,有些回答也存在问题.所以,自己花了一周的业余时间整理了一下,希望对大家有帮助. 1. 什 ...

  3. 几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:牛人 20000 字的 Spring Cloud 总结,太硬核了~ 先瞎比比一下,上一篇文章已经过去2个多月了, ...

  4. 【拥抱大厂系列】几个面试官常问的垃圾回收器,下次面试就拿这篇文章怼回去!

    点个赞,看一看,好习惯!本文 GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了3个月总结的一线大厂Java面试总结,本人已拿腾 ...

  5. Spring常问的面试

    1.Java中的异常     非检查异常(unckecked exception):Error 和 RuntimeException 以及他们的子类.     检查异常(checked excepti ...

  6. 想拿高工资?那些年Java面试官常问的知识点项目实战

    Kubernetes简介 Kubernetes(简称K8S,K和S之间有8个字母)是用于自动部署,扩展和管理容器化应用程序的开源系统.它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现.Kub ...

  7. app架构师,HTTPS面试常问全解析,吊打面试官系列!

    开篇 说一下我大概的情况.渣本毕业,工作已经有快3年了,从高中就开始玩小破站.无论是学习还是日常放松都是在b站.大学主学的软件技术专业,所以,入职bilibili是我大学时期给自己定的小目标. 在学校 ...

  8. apk开发教程!那些年Android面试官常问的知识点,2年以上经验必看

    前言 下面的题目都是大家在面试字节跳动或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享. 参考解析:郭霖.鸿洋 内容特点:条理清晰,含图像化表示更加易懂. 内容概要:包括 Hand ...

  9. 膜拜大牛!HTTPS面试常问全解析,吊打面试官系列!

    写在前面 1月初失业,找了近2个多月的工作了,还没找到心仪的工作,感觉心好慌,不知道该怎么办了?找不到工作的时候压力很大,有人说自信会很受打击,还有人说会很绝望,是人生的低谷--尽管很多时候我们自己知 ...

最新文章

  1. X-007 FriendlyARM tiny4412 u-boot移植之内存初始化
  2. 重写 View 的 Touch 方法,实现一个酷炫的九宫格图片
  3. [读书笔记]高阶函数
  4. android6.0源码分析之Camera API2.0下的Capture流程分析
  5. 手机版python3.6.6的requests库下载_Python爬虫之Python3.6 Requests库的基本使用方法
  6. 滴滴开源首次发布年度报告
  7. java编程思想 初始化_《java编程思想》_第五章_初始化与清理
  8. 某同学正为自己安装不上sqlserver数据库而愁眉苦脸,使用朋友给的方法顿时喜笑颜开,那么朋友到底出了个什么样的方法呢?...
  9. NUS 联合 Sea AI Lab 发表 Multi-view Pose Transformer,完全端到端学习,超强可扩展性...
  10. Linux内核入门(三)—— C语言基本功
  11. vivado2019.2安装+license添加教程
  12. Mac 百度云加速下载,突破限速,大文件无压力(小白使用无压力)
  13. Pandas学习任务1-3
  14. 如何让学习像打游戏一样具有成瘾性
  15. 嵌入式软件异步编程:请求的多阶段异步处理
  16. 安利一款免费、开源、实时的服务器监控工具:Netdata
  17. 2015美国大学计算机科学专业排名,2015年USNews美国大学计算机科学专业研究生排名...
  18. [Echarts可视化] 一.入门篇之简单绘制中国地图和贵州地区
  19. windows 安装 matplotlib 报错
  20. chrome浏览器主页被劫持

热门文章

  1. ubuntu子系统重置
  2. tensorflow兼容问题
  3. pix2pix, pix2pixHD, vid2vid
  4. pytorch CrossEntropyLoss用法
  5. 使用PyTorch从零开始实现YOLO-V3目标检测算法 (四)
  6. fatal error LNK1181: 无法打开输入文件“libx264.lib”
  7. python多维数组筛选
  8. tesseract 识别中文字符
  9. 矩阵的逆以及实际应用
  10. 前缀列表---Prefix-List