1.什么是Spring IoC?
IOC(控制反转),将创建对象的控制权由自己把控转移到spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系;DI(依赖注入),将对象之间的依赖关系交由框架处理,减低组件之间的耦合性,即应用程序在运行时依赖IOC容器来动态注入对象需要的外部资源。
Spring IOC有三种注入方式 :构造器注入、setter注入、注解注入。
2.什么是SpringAop和Spring AOP应用场景(最少2个)
将相同的业务逻辑提取形成切面,将通知织入到方法连接点前后,底层使用的是动态代理
调用时间监控,日志记录,session开闭,事务管理,登录验证
3.描述Spring Bean的作用域?
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围
scope配置项有5个属性,用于描述不同的作用域。
① singleton:使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。
② prototype:使用该属性定义Bean时,IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。
③ request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
④ session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
⑤ global-session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。
4.SpringBean 生命周期?
通过构造器或工厂方法创建Bean;进行set注入,给Bean设置初始值以及引用其他的Bean;将Bean实例传递给Bean后置处理器的postprocessBeforeInitialization方法;调用bean的初始化方法;将bean实例传递给bean后置器的postprocessafterInitialization方法;执行目标方法;关闭容器调用destroy方法
5.Spring框架中 用到了哪些设计模式?(不低于3个)
工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
代理设计模式 : Spring AOP 功能的实现。
单例设计模式 : Spring 中的 Bean 默认都是单例的。
模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
6.描述Spring事务传播行为?
spring事务的传播行为说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。
① PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
7.描述Spring事务的隔离级别?
1、什么是事务的隔离级别
问题 | 描述 |
---|---|
脏读 | 一个事务读到另一个事务未提交的更新数据, |
幻读 | 是指当事务不是独立执行时发生的一种现象, |
不可重复读 | 在一个事务里面的操作中发现了未被操作的数据 |
2、Spring支持的隔离级别
隔离级别 | 描述 |
---|---|
DEFAULT | 使用数据库本身使用的隔离级别ORACLE(读已提交) MySQL(可重复读) |
READ_UNCOMITTED | 读未提交(脏读)最低的隔离级别,一切皆有可能 |
READ_COMMITED | 读已提交,ORACLE默认隔离级别,有幻读以及不可重复读风险。 |
REPEATABLE_READ | 可重复读,解决不可重复读的隔离级别,但还是有幻读风险。 |
SERLALIZABLE | 最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务 |
8.Spring事务传播行为 REQUIRES和REQUIRES_NEW区别?
REQUIRES:当前方法被另一个事务方法调用时合并成一个事务;
REQUIRES_NEW:当前方法必须启动一个新事务并在自己的事务内运行,若有事务在运行则将它挂起
##9.SpringMVC中的Bean是线程安全的吗? 说出你的解决方案?
Spring管理的Bean对象默认是单例模式,当多线程操作Bean对象时就会出现线程安全问题;
因为在多线程中线程改变了bean对象的可变成员变量时,其他线程就无法访问该bean对象的初始状态,
这样就造成数据错乱。所以需要用线程同步来处理这个问题。
方法一、使用ThreadLocal,ThreadLocal会为每一个线程提供一个独立的变量副本,
这样在多线程对数据访问就不会出现冲突。因为每一个线程都拥有自己的变量副本,因此也就不需要同步该变量。
ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。
方法二、如果时web应用,可以使用Spring Bean的作用域中的request,在controller类前面加上@Scope("****"),
表明每次请求都会生成一个新的Bean对象。这样也能起到线程安全的作用。
方法三、使用线程同步,关键字synchronized
当线程较多时,当一个线程调用该方法时,其他想要调用此方法的线程就要block ,
多线程并发量大的时候会对性能有一定的影响。
方法四:避免定义全局变量