​ IoC 容器是 Spring⽤来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注⼊。这样可以很⼤程度上简化应⽤的开发,把应⽤从复杂的依赖关系中解放出来。 IoC 容器就像是⼀个⼯⼚⼀样,当我们需要创建⼀个对象的时候,只需要配置好配置⽂件/注解即可,完全不⽤考虑对象是如何被创建出来的。

2、Spring AOP,动态代理

​ AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关,却为业务模块所共同调⽤ 的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模 块间的耦合度,并有利于未来的可拓展性和可维护性。

​ Spring AOP就是基于动态代理的,如果要代理的对象,实现了某个接⼝,那么Spring AOP会使⽤JDK Proxy,去创建代理对象,⽽对于没有实现接⼝的对象,就⽆法使⽤ JDK Proxy 去进⾏代理了,这时候 Spring AOP会使⽤Cglib ,这时候Spring AOP会使⽤ Cglib ⽣成⼀个被代理对象的⼦类来作为代理,

3、Bean生命周期

单例对象: singleton

出生:当容器创建时对象出生

活着:只要容器还在,对象一直或者

死亡:容器销毁,对象消亡

总结:单例对象的生命周期和容器相同

多例对象: prototype

出生: 使用对象时spring框架为我们创建

活着:对象只要是在使用过程中就一直活着

死亡:当对象长时间不用且没有其它对象引用时,由java的垃圾回收机制回收

白嫖资料

4、Bean作用域?默认什么级别?是否线程安全?Spring如何保障线程安全的?

| 名称 | |

| — | — |

| singleton | 单例对象,默认值的作用域 |

| prototype | 每次获取都会创建⼀个新的 bean 实例 |

| request | 每⼀次HTTP请求都会产⽣⼀个新的bean,该bean仅在当前HTTP request内有效。 |

| session | 在一次 HTTP session 中,容器将返回同一个实例 |

global-session 将对象存入到web项目集群的session域中,若不存在集群,则global session相当于session

默认作用域是singleton,多个线程访问同一个bean时会存在线程不安全问题

保障线程安全方法:

在Bean对象中尽量避免定义可变的成员变量(不太现实)。

在类中定义⼀个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中

ThreadLocal:

​ 每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。

​ 将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。

5、Spring事务隔离级别和事务传播属性

隔离级别:

  1. DEFAULT (默认) 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。

  2. READ_UNCOMMITTED (读未提交) 这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。

  3. READ_COMMITTED (读已提交) 保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

  4. REPEATABLE_READ (可重复读) 这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。

  5. SERIALIZABLE(串行化) 这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。

Spring事务传播属性(Propagation):

  1. REQUIRED(默认属性) 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。

  2. MANDATORY 支持当前事务,如果当前没有事务,就抛出异常。

  3. NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。

  4. NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

  5. REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。

  6. SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。

  7. NESTED 支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。 嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。

6、Spring以及Spring MVC常见注解

Spring部分:

​ 声明bean的注解

​ @Component 通⽤的注解,可标注任意类为 Spring 组件

白嫖资料

​ @Service 在业务逻辑层使用(service层)

​ @Repository 在数据访问层使用(dao层)

​ @Controller 在展现层使用,控制器的声明(controller层)

​ 注入bean的注解

​ @Autowired:可以对类成员变量、方法、构造方法进行标注

​ 默认按照类型注入,若要按照名称注入,需要搭配**@Qualifier**注解一起使用

​ @Resource:默认按照名称来装配注入

Spring MVC部分:

​ @Controller 声明该类为SpringMVC中的Controller

​ @RequestMapping 用于映射Web请求

​ @ResponseBody 支持将返回值放在response内,而不是一个页面,通常用户返回json数据

​ @RequestBody 允许request的参数在request体中,而不是在直接连接在地址后面。

​ @PathVariable 用于接收路径参数,比如@RequestMapping("/hello/{name}")申明的路径,将注解放在参数中前,即可获取该值,通常作为Restful的接口实现方法。

7、@autowired和@resource的区别?

@Autowired:可以对类成员变量、方法、构造方法进行标注

​ 默认按照类型注入,若要按照名称注入,需要搭配**@Qualifier**注解一起使用

@Resource:默认按照名称来装配注入

8、mybatis如何防止sql注入?$和#的区别是什么?传入表名用哪个?

防止sql注入:

​ 在编写mybatis的映射语句时,尽量采用“#{xxx}”这样的格式

#和$区别:

| # | $ |

| — | — |

| 相当于对数据加上双引号 | 相当于直接显示数据 |

| 很大程度上防止SQL注入 | 无法防止SQL注入 |

| #{xxx},使用的是PreparedStatement,会有类型转换,比较安全 | ${xxx},使用字符串拼接,容易SQL注入 |

​ 简单的说就是#{}是经过预编译的,是安全的,${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。

要实现动态传入表名、列名,需要做如下修改:

添加属性statementType=“STATEMENT”,同时sql里的属有变量取值都改成${xxxx}

9、Spring MVC工作原理

客户端(浏览器)发送请求,直接请求到 DispatcherServlet 。

DispatcherServlet 根据请求信息调⽤ HandlerMapping ,解析请求对应的 Handler 。

解析到对应的 Handler (也就是 Controller 控制器)后,开始由HandlerAdapter 适配器处理。

HandlerAdapter 会根据 Handler 来调⽤真正的处理器开处理请求,并处理相应的业务逻辑。

处理器处理完业务后,会返回⼀个 ModelAndView 对象, Model 是返回的数据对象

ViewResolver 会根据逻辑 View 查找实际的 View 。

DispaterServlet 把返回的 Model 传给 View (视图渲染)。

把 View 返回给请求者(浏览器)

最后

以上分享的全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf,高清完整版戳这里免费领取

还有更多Java笔记分享如下:

andler 来调⽤真正的处理器开处理请求,并处理相应的业务逻辑。

处理器处理完业务后,会返回⼀个 ModelAndView 对象, Model 是返回的数据对象

ViewResolver 会根据逻辑 View 查找实际的 View 。

DispaterServlet 把返回的 Model 传给 View (视图渲染)。

把 View 返回给请求者(浏览器)

最后

以上分享的全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf,高清完整版戳这里免费领取

还有更多Java笔记分享如下:

不是吧阿sir,字节跳动架构师讲解Java开发相关推荐

  1. 字节跳动架构师讲解Java开发!美的java开发面试

    前言 今天中午收到我司安全部发了一封邮件:Jackson存在安全漏洞.查了一下,这件事并不算很新鲜了(已经过了5天的样子),本文来聊聊吧. 说起来还蛮戏剧化:阿里云向Jackson官方提交了一个Jac ...

  2. 字节跳动架构师讲解Java开发!dockerstop命令

    美团 一面: 1.ConcurrentHashMap实现原理 2.HashMap实现原理 3.锁的实现原理 4.synchronized和重入所实现原理以及区别 5.一个char[]数组,里面有空格, ...

  3. 字节跳动架构师讲解Android开发!已成功拿下字节、腾讯、脉脉offer,含BATJM大厂

    开头 程序员面试,除了面试技术外,有的公司经常会问应聘者和技术无关的问题,考验求职者的综合能力,并以此作为是否录用的依据,很多时候这类问题往往没有标准答案,就看求应聘者临场的反应能力如何. 张工是一名 ...

  4. 架构师讲解Java中websocket的应用

    这篇文章主要来介绍一下在java项目中,特别是java web项目中websocket的应用. 场景:我做了一个商城系统,跟大多数商城系统,分为客户端和后台,客户端供客户浏览,下单,购买,后台主要管理 ...

  5. 腾讯架构师讲解Java接口的继承与抽象类

    在实施接口中,我们利用interface语法,将interface从类定义中独立出来,构成一个主体.interface为类提供了接口规范. 在继承中,我们为了提高程序的可复用性,引入的继承机制.当时的 ...

  6. 字节跳动内推-杭州-后端开发(高级)工程师-电商运营赋能

    字节跳动内推-杭州-后端开发(高级)工程师-电商运营赋能 职位描述 1.探索字节系平台(抖音.抖音火山版.头条.西瓜视频等)内容电商业务模式,承担系统的设计开发维护工作: 2.负责搭建支持电商全链路业 ...

  7. 微软企业服务部华东区招聘顾问/架构师/.NET高级开发员

    [因应华东区服务业务扩展,长期需要咨询顾问/架构师/.NET高级开发员,有意者发送邮件至 ningxue@microsoft.com] Job Title: .NET Consultant/Archi ...

  8. Java架构师和java工程师的区别是什么?架构师薪资是多少?

    java架构师,现在很多新手都知道的名词,这个职位最早在IT领域是没有的,是由于最近几年来,互联网的迅猛发展,网站对于对数据量和高并的活跃度发所引发的需求,引起了众多传统的技术人员的力不从心,越来越多 ...

  9. 高级开发工程师如何快速晋升为架构师?高级开发工程师与架构师到底有啥区别?

    大家好,我是冰河~~ 一直以来,都想写一个系统介绍架构师核心技能的专栏,那就是<架构师进阶系列>.为什么要写这个专栏呢?很多人认为自己技术能力不错,但是每次想面试大厂的时候,总是被面试官吊 ...

最新文章

  1. 封装运动框架多个属性
  2. js获取选中文件的后缀名
  3. 什么是梯度爆炸/梯度消失?
  4. AceTeamwork 软件成就继续蝉联国内最优秀的项目工时(timesheet)及费用报销(expense)软件...
  5. LVM逻辑卷详解及创建
  6. ELK套件FileBeat部署
  7. 免费体验,阿里云智能LOGO帮你解决设计难题
  8. 数据结构与算法--图的表示与常用算法
  9. Airflow 中文文档:使用Mesos扩展(社区贡献)
  10. Rust 创始人谈 Rust 2019 和未来:社区应限制成长速度
  11. trie树 java 开源_用于实现Trie的内存java应用程序中的最佳开源
  12. Unity IOC简单认知
  13. PHP中Trait详解及其应用
  14. 用nginx转发请求tomcat 如何配置访问日志获取真实ip
  15. 免费金融数据API(基金,股票),基金股票网格交易模拟服务
  16. 10015---MySQL--事务
  17. gmx-MMPBSA — error while loading shared libraries: libgfortran.so.3: cannot open shared object file
  18. python将一个正整数分解质因数
  19. 如何观察一棵树 - 笔记
  20. 【浅谈递归(一)】递归的基本思想

热门文章

  1. 请问:新抢滩登陆战2004对机器配置究竟要多大?
  2. python文件名批量重命名脚本
  3. 行政事业单位收入体系分类
  4. 【脚本】关于扇贝单词生词本未学单词bug增强脚本
  5. SpringMvc 异常处理器
  6. Java 集合深入理解(11):LinkedList
  7. 通过网络调试助手连接上阿里云物联网平台
  8. matlab脸部合成,【Matlab】表情合成尝试(3)——ERI伪皱纹映射
  9. 人工智能岗位替代——证券交易员
  10. 指环王游戏java_教你如何在演奏中“假唱”,演奏转换教程