后端面试-jspt

  1. 什么是ioc, di

IoC 即控制反转,DI即依赖注入
IoC是一种思想,而DI是这种思想的具体实现方式
创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器
控制的什么被反转了?就是:获得依赖对象的方式反转了
  ●谁依赖于谁:当然是应用程序依赖于IoC容器;
  ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
  ●谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
  ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

  1. spring bean的加载流程

从大体上可以分为3步:
1.容器初始化,封装Bean信息成BeanDefinition对象,存入beanFactory容器中beanDefinitionMap集合里
2.Bean实例化存入singletionObjects集合中
3.调用getBean方法时从singletionObjects集合中取出Bean实例对象

3. springboot的标签, spring的常用标签;

springboot的标签
1.1 @Controller/@Service/@Repository/@Component @Controller 控制器 (注入服务)
@Service 服务 (注入dao)
@Repository (实现dao访问)
@Component泛指组件,组件不好分类的时候,使用此标签。
1.2 @RequestMapping 用于映射请求
RequestMapping (value=“submit”,method=RequestMethod.POST)
@PostMapping(“/admin/login.do”)
url请求的地址 :最后加.do是为了服务器区分是静态资源还是servlet请求
@GetMapping(“/get/{id}”)
1.3 RequestBody与ResponseBody
1.4 @Controller和@RestController @RestController相当于@Controller+@ResponseBody结合一起使用的效果,返回json数据格式。

spring的常用标签 @Component:泛指各种组件
@Controller、@Service、@Repository都可以称为@Component。 @Controller:控制层
@Service:业务层 @Repository:数据访问层 @Autowired:由bean提供
@Autowired可以作用在变量、setter方法、构造函数上; 有个属性为required,可以配置为false;
@Inject:由JSR-330提供 @Inject用法和@Autowired一样。 @Resource:由JSR-250提供
5、Java配置类相关注解 @Configuration 声明当前类为配置类; @Bean
注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式; @ComponentScan 用于对Component进行扫描
@Value
${}是去找外部配置的参数,将值赋过来
#{}是SpEL表达式,去寻找对应变量的内容
#{}直接写字符串就是将字符串的值注入进去

  1. 浅拷贝,深拷贝,区别;

深拷贝和浅拷贝是指在赋值一个对象时,拷贝的深度不同。
在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深拷贝,直到最底层的基本数据类型为止。这意味着,对于深拷贝后的对象,即使原对象的属性值发生了变化,深拷贝后的对象的属性值也不会受到影响。
相反,浅拷贝只会拷贝对象的第一层属性,如果这些属性是对象,则不会对这些对象进行拷贝,而是直接复制对象的引用。这意味着,对于浅拷贝后的对象,如果原对象的属性值发生了变化,浅拷贝后的对象的属性值也会跟着发生变化。
举个例子,假设我们有一个类 A,其中包含两个属性 x 和 y,x 是一个数字,y 是一个列表。我们将 A 的一个实例 a 赋值给另一个实例
b,如果我们使用深拷贝,那么 b 将会是一个完全独立的对象,即使我们对 a 的 y 属性进行修改,b 的 y 属性也不受影响

  1. spring bean的作用域有哪些?

Spring支持五个作用域:singleton、prototype、request、session、global session

1.singleton:默认作用域Spring IOC容器仅存在一个Bean实例,Bean以单例方式存在,在创建容器时就同时自动创建了一个Bean对象。作用域范围是ApplicationContext中。

2.prototype:每次从容器中调用Bean时,都会返回一个新的实例,即每次调用getBean时。作用域返回是getBean方法调用直至方法结束。

相当于执行newXxxBean().Prototype是原型类型,再我们创建容器的时候并没有实例化,而是当我们获取Bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。

3.request:每次HTTP请求都会创建一个新的Bean,作用域范围是每次发起http请求直至拿到相应结果。该作用域仅适用于WebApplicationContext环境。

4.session:首次http请求创建一个实例,作用域是浏览器首次访问直至浏览器关闭。

同一个HTTP
Session共享一个Bean,不同Session使用不通的Bean,仅适用于WebApplicationContext环境。

5.global-session:作用域范围是WebApplicationContext中。一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境。
11、Spring框架中的Bean是线程安全的么?如果线程不安全,那么如何处理?
Spring容器本身并没有提供Bean的线程安全策略,因此可以说Spring容器中的Bean本身不具备线程安全的特性,但是具体情况还是要结合Bean的作用域来讨论。

(1)对于prototype作用域的Bean,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题。

(2)对于singleton作用域的Bean,所有的线程都共享一个单例实例的Bean,因此是存在线程安全问题的。但是如果单例Bean是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行查询以外的操作,那么这个单例Bean是线程安全的。比如Controller类、Service类和Dao等,这些Bean大多是无状态的,只关注于方法本身。

有状态Bean(Stateful Bean) :就是有实例变量的对象,可以保存数据,是非线程安全的。

无状态Bean(Stateless Bean):就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。

对于有状态的bean(比如Model和View),就需要自行保证线程安全,最浅显的解决办法就是将有状态的bean的作用域由“singleton”改为“prototype”。

也可以采用ThreadLocal解决线程安全问题,为每个线程提供一个独立的变量副本,不同线程只操作自己线程的副本变量。

ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。
———————————————— 版权声明:本文为CSDN博主「张维鹏」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a745233700/article/details/80959716

  1. HashMap数据是顺序的吗? 如果要保证顺序使用哪种数据结构。

“HashMap是一种无序的数据结构,它并不保证存储的键值对的顺序与插入的顺序一致,不是线程安全的,key 可以存入null

Hashtable,无顺序,线程安全的,key 不可以存入null
有序
LinkedHashMap
LinkedList
TreeMap,不是线程安全的,key 不可以存入null

  1. spring的事务传播行为?

Spring中的7个事务传播行为:

事务行为 说明 PROPAGATION_REQUIRED 支持当前事务,假设当前没有事务。就新建一个事务
PROPAGATION_SUPPORTS 支持当前事务,假设当前没有事务,就以非事务方式运行
PROPAGATION_MANDATORY 支持当前事务,假设当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW 新建事务,假设当前存在事务。把当前事务挂起
PROPAGATION_NOT_SUPPORTED 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起
PROPAGATION_NEVER 以非事务方式运行,假设当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

———————————————— 版权声明:本文为CSDN博主「波波烤鸭」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38526573/article/details/87898161
1.required:(默认传播行为),如果当前有事务,其他就用当前事务,不会新增事务。
例如:方法A调用方法B,它们用同一个事务。(如果B没有事务,它们会用同一个事务。)(只要有一个回滚,整体就会回滚)

2.requires_new:如果当前有事务,其他不会加入当前事务,会新增事务。即他们的事务没有关系,不是同一个事务。 如果其他没有事务,那么以当前事务运行。 例如:方法A调用方法B,它们用不同的事务。(B不会用A的事务,会新增事务。)

3.supports:当前没有事务,就以非事务运行。当前有事务呢?就以当前事务运行。 例如:方法A调用方法B,如果A没有事务,那么B就以非事务运行。 如果A有事务就以A事务为准。如果A没有事务,那么B就会以非事务执行。

4.mandatory:其他没有事务就会抛异常。当前没有事务抛出异常,当前有事务则支持当前事务。 支持当前事务,如果当前没有事务就会抛出异常。 例如:方法A调用方法B,如果方法A没有事务,那么就会抛出异常。

5.not_supported:以非事务执行。 例如:方法A调用方法B,方法B会挂起事务A以非事务方式执行。

6.never:以非事务执行,如果存在事务,抛出异常。 总是以非事务执行,如果存在事务,那么就抛出异常。

7.nested:如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。 如果当前事务不存在,那么其行为与Required一样。 例如:方法A中调用了方法B,B中try catch手动回滚,A不会回滚
———————————————— 版权声明:本文为CSDN博主「荠菜煎包」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_73687324/article/details/128255689

  1. mysql数据库的事务隔离级别?

一、事务的基本要素(ACID)

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

二、事务的并发问题

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果
不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

三、MySQL事务隔离级别

事务隔离级别 脏读 不可重复读 幻读 读未提交(read-uncommitted) 是 是 是
不可重复读(read-committed) 否 是 是 可重复读(repeatable-read) 否 否 是
串行化(serializable) 否 否 否

  1. spring 线程池 为啥用? 能不能直接使用提供的线程池?

在创立和销毁线程时破费更多的系统资源。因而同时创立太多线程的 JVM
可能会导致系统内存不足,这就须要限度要创立的线程数,也就是须要应用到线程池
Spring 中默认自带线程池_org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor,一般有可以直接使用,这是时候使用的是默认的配置,直接使用_@Autowired注入使用

  1. session cookies 区别;

1、对象不同
cookie:是针对每个网站的信息,每个网站只能对应一个,其他网站无法访问,这个文件保存在客户端,每次您拨打相应网站,浏览器都会查找该网站的
cookies,如果有,则会将该文件发送出去。cookies文件的内容大致上包括了诸如用户名、密码、设置等信息。

session:是针对每个用户的,只有客户端才能访问,程序为该客户添加一个
session。session中主要保存用户的登录信息、操作信息等等。此 session将在用户访问结束后自动消失(如果也是超时)。

2、存储数据大小不同 cookie:一个 cookie存储的数据不超过3K。

session:session存储在服务器上可以任意存储数据。当 session存储数据太多时,服务器可选择进行清理。

3、生命周期不同
cookie:cookie的生命周期当浏览器关闭的时候就消亡了,cookie的生命周期是累计的,从创建时就开始计时,30min后cookie生命周期结束。

session:session的生命周期是间隔的,从创建时开始计时如在30min内没有访问session,那么session生命周期就被销毁。

4、存储位置不同 cookie:cookie数据保存在客户端。

session:session数据保存在服务器端。

5、数据类型不同 两者都是key-value结构,但针对value的类型是有差异的。

cookie:value只能是字符串类型。

session:value是object类型。

6、安全性不同 cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session

  1. web上下文都有哪些?

tomcat是一个servlet容器,也就是一个服务器,servlet一个服务类,用于提供服务。servlet需要servlet容器来启动,不能脱离容器独自运行
你发一个http请求到服务器请求浏览一个网页,tomcat会吧这个请求解析出来,包装成一个request对象,然后根据你的请求地址,把request丢给相应的servlet处理。
web上下文可以看成web应用的运行环境,一般用context名字来修饰,里面保存了web应用相关的一些设置和全局变量。
request,session,application是域对象,request前面介绍了,是封装了请求的一个类,可以获得请求的相关信息;session是用来代表单个会话,一般用于保存用户的一次会话的相关数据;
application就是web上下文。
所有这些对象都是tomcat自己启动,运行和维护的。我们开发web应用,就是使用这些已经内置好的对象,获取相关信息,然后编写自己的servlet进行处理,再返回给用户。
———————————————— 版权声明:本文为CSDN博主「星河scorpion」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wzq__janeGreen_/article/details/86527830

  1. LocalThread 是什么,原理,或者说使用场景。

ThreadLocal是一种线程隔离机制,他提供了多线程环境下对于共享变量访问的安全性。
在多线程访问共享变量的场景中,一般的解决办法是对共享变量加锁,从而保证在同一时刻只有一个线程能够对共享变量进行更新,并且基于Happens-Before规则里面的监视器锁规则,又保证了数据修改后对其它线程的可见性。
ThreadLocal的具体实现原理是,在Thread类里面有一个成员变量ThreadLocalMap,它专门来存储当前线程的共享变量副本,后续这个线程对于共享变量的操作,都是从这个ThreadLocalMap里面进行变更,不会影响全局共享变量的值。
升化 ThreadLocal使用场景比较多,比如在数据库连接的隔离,对于客户短请求会话的隔离等等。
在ThreadLocal中,除了空间换时间的设计思想外,还有一些比较好的设计思想,比如线性探索解决hash冲突,数据预清理机制,若引用key设计尽可能避免内存泄漏等等。
———————————————— 版权声明:本文为CSDN博主「chensi2113」的原创文章,遵循CC 4.0
BY-SA版权协议,转载请附上原文出处链接及本声明。

  1. 你要写redis, 可能会问问 redis常用数据结构;

redis常用的五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及zset(有序集合);
redis整体来说并非只有一个线程(多线程),只是redis在处理网络请求,k/v读写操作这个过程是用一个线程来处理的,它的其他功能:持久化、异步删除、集群同步都是采用额外的线程来完成的。
缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,造成数据库的压力倍增的情况。解决方案:
接口层增加校验,比如用户鉴权校验,参数做校验 比如:id 做基础校验,id <=0的直接拦截。
对于像ID为负数的非法请求直接过滤掉,采用布隆过滤器(Bloom Filter)。
针对在数据库中找不到记录的,我们仍然将该空数据存入缓存中,当然一般会设置一个较短的过期时间。
缓存雪崩
缓存服务器宕机或者大量缓存集中某个时间段失效,导致请求全部去到数据库,造成数据库压力倍增的情况,这个是针对多个key而言。
解决
实现缓存高可用,通过redis cluster将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题。
批量往Redis存数据的时候,把每个Key的失效时间都加个随机值。
redis过期后的一瞬间,有大量用户请求同一个缓存数据,导致这些请求都去请求数据库,造成数据库压力倍增的情,针对一个key而言。
缓存击穿与缓存雪崩的区别是这里针对的是某一热门key缓存,而雪崩针对的是大量缓存的集中失效。
设置热点数据永远不过期。
添加互斥锁,保证同一时刻只有一个线程可以访问数据库。
————————————————
版权声明:本文为CSDN博主「用生命研发技术」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37242720/article/details/123741487

  1. mybatis 传参时 ${} #{} 区别。

#{}:将传入的数据都当成一个字符串,会对传入的变量自动加一个单引号。
#̲{}:很大程度上能防止sql …{}:不能防止sql 注入 排序时使用order by 动态参数时需要注意,用$而不是#

原文链接:https://blog.csdn.net/m0_62520968/article/details/124682380

15,JVM调优工具

jconsole 使用jvm的扩展机制获取并展示虚拟机中运行的应用程序的性能和资源消耗等信息。
直接在jdk/bin目录下点击jconsole.exe即可启动

VisualVM 个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java
技术的应用程序(Java 应用程序)的详细信息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值