借鉴 spring 面试内容

1.Spring的IOC有三种注入方式 : 
第一是根据属性注入,也叫set方法注入; 
第二种是根据构造方法进行注入; 
第三种是根据注解进行注入
Spring的优点:主要是根据它的IOC和AOP体现的。IOC主要是解决了代码的耦合性问题,而AOP是面向切面编程的最好解释!

2.Spring中IOC, AOP 
IOC就是控制翻转或是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过Spring的bean工厂为你长生这样一个对象。 
AOP就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类, 
那你每一类中都要写关于日志的方法。但是如果你用AOP,那么你可以写一个方法,在这个方法中有关于数据库操作的方法,

3.Spring的IOC/AOP/代理 
IOC是控制反转,是Spring的核心思想。通过面向接口编程来实现对业务组件的动态依赖。 aop是面向切面编程,它并不是只在Spring或者java中才有的,它和面向对象编程(oop)是相对而言的另一种编程思想。 
Spring在实现AOP编程时利用的是java的代理机制。个人觉得java代理机制真的是很神奇。核心内容并不多

4.Spring的IOC是解耦,AOP是干什么的 
AOP面向切面编程将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。 
比如:很多方法可能会抛异常,你要记录这个异常到日志中去,可以写个拦截器类,在这个类中记录日志, 
在spring.xml中配置一个对这些要记录日志的方法的AOP拦截器在这个方法执行后调用这个拦截器,记录日志。

5.讲解一下Java中Spring中IOC和AOP 
IOC:说直白点,就是通过配置文件(XML或.properties)指定需要实例化的JAVA类(类名的完整字符串),包括该JAVA类的一组初始化值,然后我们在代码中加载该配置文件,然后通过 .getBean() 函数就可以得到一个该JAVA类的对象, 并且该对象已经根据配置文件中指定的属性值进行了初始化。 
AOP:这个比IOC更简单,直白点说就是实现调用某个方法之前或/和之后,自动执行一系列自定义的语句

6.简述Spring框架中IOC和AOP 
IOC:控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制; 
第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。 
AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。 
Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。 
不过AOP和IOC并不是spring中特有的,只是spring把他们应用的更灵活方便 

7.什么是事务

事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题

事务最重要的两个特性,是事务的传播级别数据隔离级别

传播级别:的是事务的控制范围,

事务隔离级别:的是事务在数据库读写方面的控制范围。

8.spring  7种事务传播级别

1) propagation_required ,默认的spring事务传播级别 上下文中已经存在事务,那么就加入到事务中执行,如果当前上下文中不存在事务,则新建事务执行
2)propagation_supports 上下文存在事务,则支持事务加入事务,如果没有事务,则使用非事务的方式执行
3)propagation_mandatory 该级别的事务要求上下文中必须要存在事务,否则就会抛出异常
4)propagation_requires_new 每次都会新建一个事务,并且同时将上下文中的事务挂起,执行当前新建事务完成以后,上下文事务恢复再执行
5)propagation_not_supported 上下文中存在事务,则挂起事务,执行当前逻辑,结束后恢复上下文的事务
6)propagation_never 上下文中不能存在事务,一旦有事务,就抛出runtime异常
7)propagation_nested 上下文中存在事务,则嵌套事务执行,如果不存在事务,则新建事务

9.spring 五种隔离级别

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

2、serializable :最严格的级别,事务串行执行,资源消耗最大;
3、repeatable read :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
4、read committed :大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
5、read uncommitted :保证了读取过程中不会读取到非法数据。

脏读 :所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。
 
不可重复读 :事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。
 
幻读 : 事务A首先根据条件索引得到5条数据,然后事务B改变了数据库一条数据,导致也符合事务A当时的搜索条件,这样事务A再次搜索发现有6条数据了,就产生了幻读。

Serializable 最安全 伴随而来的是高昂的性能开销
事务常用的两个属性:readonly和timeout
readonly:设置事务为只读以提升性能
timeout:设置事务的超时时间,一般用于防止大事务的发生

原文地址:https://www.cnblogs.com/wcnwcn/p/7742160.html