aop配置多个包_Spring之AOP面试题

4e37d89a61dd727c8ab31acbfa805dac.png Spring之AOP面试题 ebdaa82d2755332ea23527318c9ed198.png 一、请概述一下您对AOP的理解?

1. AOP(Aspect-Oriented Programming)中文含义是面向切面编程,它是面向对象编程的一种补充。它通过预编译方式和运行期间的动态代理来实现程序功能的统一维护。换句话说,AOP是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

2. AOP一般用于主业务需要切入系统级业务的场合。如:主业务是一个学生管理系统,如果我们要将用户的每一步操作记录在日志中。我们就可以使用AOP技术来实现日志功能的嵌入。使用AOP的好处在于我们可以不改变我们原有业务代码的情况下将日志功能集成进入主业务中。

3. AOP主要是针对系统级业务的解耦。它的主要应用场景有:日志记录,性能统计,安全控制,事务处理等。

答案解析:1. 在这个概念中,我们肯定很疑惑什么叫做切面呢?切面是一个关注点的模块化。以日志为例:我们想给学生添加日志,我们关注点是为学生的主业务添加日志功能,这里日志就是切面。2. AOP是OOP(面向对象编程)的补充和完善,我们可以看出我们的主业务还是要用OOP的思想去实现的。在OOP中的继承、多态等概念都是一种上下级关系的定义。而要实现一种平级的左右关系定义时就显得有些无力。3. AOP是一种实现分散关注编程的设计方法,这句话的意思是原来作为一个程序员在没有使用AOP的情况下,如果我们需要在主业务中嵌入日志等各种功能,我们除了要考虑主业务,还要将一部分精力放在日志等功能的编写上。而使用了AOP后,我们可以将日志实现部分作为切面提取出来,程序员只需要在需要的地方嵌入日志功能(即切面)即可。我们可以看出,对于整个程序而言,关注点被分散成了多个。而撰写主业务逻辑的人员只需要关注到自己写的主业务逻辑中即可。

ebdaa82d2755332ea23527318c9ed198.png 二、解释一下AOP中常见的概念?

1.  切面(Aspect):切面是一个关注点的模块化,这个关注点可能是横切多个对象;比如:日志,事务等。

2.  连接点(Join Point):连接点是指在程序执行过程中某个特定点,比如某方法调用的时候或者处理异常的时候;换句话说,指可以被切面织入的方法,我们都可以被认为是连接点,通常业务接口中的方法均为连接点。

3. 通知(Advice):指在切面的某个特定的连接点上执行的动作。换句话说,通知是切面的一种实现,可以完成简单织入功能。在换句话说,切入点定义切入的位置,通知定义切入的时间。

4. 切点(Pointcut):指匹配连接点的断言。通知与一个切入点表达式关联,并在满足这个切入的连接点上运行,例如:当执行某个特定的名称的方法。举例:在一个类中,若doSome()将被增强,而另外一个方法 doOther 没有被增强,则 doSome 为切入点,而 doOther仅为连接点。被 final 修饰的方法不可能是切入点,因为他不能被修改,所以也就不能被增强,所以就无法称为切点。

5. 引入(Introduction):引入也被称为内部类型声明,声明额外的方法或者某个类型的字段。

6. 目标对象(Target Object):目标对象是被一个或者多个切面所通知的对象。换句话说,是要被增强的对象。

7. 织入(Wearving):指把切面连接到其他应用程序类型或者对象上,并创建一个被通知的对象。或者说形成代理对象的方法的过程。换句话说,将切面代码插入到目标对象的过程。

答案解析:下面我们通过图来表示一下各个概念:

b1824c6856fee831ff907568c700cb37.png

三、Spring中的通知有哪一些类型?

1. 前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。

2. 返回后通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。 

3. 抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。

4. 后通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

5. 环绕通知(Around Advice):包围一个连接点(join point)的通知。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。环绕通知是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。 

答案解析:记住这一句话,切入点定义切入的位置,通知定义切入的时间。

四、Spring中如何使我们更有效的使用JDBC?

1. 在Spring框架中给我们提供了模板类来帮助我们更有效地使用JDBC,这个模板叫JdbcTemplate。

2. JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用。它是Spring框架的一部分。JdbcTemplate处理了各种数据库相关资源的建立与释放。它有效的帮助我们避免了一些在JDBC编程中经常犯的错误。比如:忘记关闭链接等。我们只需要提供SQL语句和提取结果即可。其他的部分都由JdbcTemplate帮我们处理好了。

五、Spring中事务管理的方式有哪些?

1. 程序化事务管理(编程式事务管理):利用编程(编写代码)的帮助下实现事务,这种方式的好处在于非常灵活,但是缺点是维护的成本特别高且难度特别大。我们是不推荐使用的。

2. 声明式事务管理:又分为使用注解配置和使用XML配置两种方式。

2.1 使用注解配置(下面简单的描述一下注解配置方式的实现过程):

A. 引入事务相关的两个包(spring-jdbc-xxx.jar和spring-tx-xxx.jar)

B. 在Spring核心配置文件中配置事务管理器

c8ead1bee6a8ae2a8b7dd78e2558bbfa.png

C. 在Spring核心配置文件中配置事务的通知(切面)

6ff8e469fb9f61f60102b0e028131836.png

D. 这样在com.ambow.service包下面的所有类下面的所有方法都会被加入Spring事务管理,如下:

8df5c828066b9be0216f3af0f86e4d95.png

2.2 使用XML配置:

A. 包的引入如上面一样

B. 在Spring核心配置文件中配置事务管理器,方式和上面一样

C. 然后在配置自动注解驱动,以便可以识别事务相关的注解代码

D. 在Service层的需要添加事务的方法上,需要写对应的注解。举例如下:

e8a2dcd7d2404374f8e77712c32dc10b.png

答案解析:第一种编程式事务的方式,由于维护的复杂性,主业务代码和事务不能很好的分离等诸多因素,不被推荐使用。我们在上课的时候也没有进行讲解。第二种是我们上课重点讲过的,也是开发中最常用的方式,需要大家牢记。

六、AOP有哪些实现方式?

1. 静态代理方式:指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强代理。

A. 编译时编织(特殊编译器实现)

B. 类加载时编织(特殊的类加载器实现)。

2. 动态代理方式:在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。

A.JDK动态代理实现方式

B. CGLib动态代理实现方式

七、请详细阐述事务的概念及特性?

1. 概念解释:事务是访问数据库的执行操作序列。这些操作要么都做,要么都不做。这些操作序列是不可分割的工作单元。从而保证数据的完整性。

2. 事务的四个特性:

A. 原子性(Automicity,A):执行序列要么全部执行,要么全部不执行。该执行序列不可分割。

B.  一致性(Consistency,C):事务的执行结果,必须从一个正确的状态到另一个正确的状态。

C. 隔离性(Isolation,I):一个事务的执行不能被另一个事务影响。

D. 持久性(Durabillity,D):事务一旦被提交,将永久被保存

八、事务并发可能存在的问题有哪些并阐述?

1. 脏读:A 事务访问并改写了数据,尚未进行提交。此时,B 事务进来刚刚读取了被改写的数据。而此时,A 事务进行了回滚,这样 B 事务就读取到了无效数据。

2. 不可重复读:A 事务多次查询同一个数据,在其中的两次查询之间,事务 B 对该数据进行了访问并修改。导致 A 事务两次查询同一个数据得到的结果不一样。

3. 幻读:幻读和不可重复读类似,第一个事务 A,两次按照同一查询条件查询数据,第一次按该查询条件读取了几行数据,而此时 B 事务插入或者删除了一些数据。然后 A 事务依然按照之前的条件进行查询,发现查询除了不存在的记录或者原有记录不见了。

4. 丢失更新:A 事务读取一个数据时,B 事务也访问了该数据。那么在 A 事务中修改了这个数据后,B 也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。

九、Spring事务中的隔离级别?

1.  ISOLATION_DEFAULT:使 用数 据库 默认 的隔 离界别 , MySQL 默认 采用REPEATABLE_READ(可重复读)隔离级别,可以防止脏读、不可重复读问题,但是,会有幻读的问题存在;Oracle 默认采用的 READ_COMMITTED(读已提交)隔离级别,可以防止脏读的发生,但是会存在不可重复读和幻读的问题。(默认的)

2. ISOLATION_READ_UNCOMMITTED:读未提交(读取未提交的数据)。最低的隔离级别,允许读取,允许读取尚未提交的的数据变更,可能会导致脏读、幻读、不可重复读。

3. ISOLATION_READ_COMMITTED:读已提交。允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读、不可重复读仍有可能发生。简单来说:一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的

4. ISOLATION_REPEATABLE_READ:可重复读。对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。简单来说:保证在同一个事务中多次读取同样数据的结果是一样的。

5.  ISOLATION_SERIALIZABLE:最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就说,该级别可以阻止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

我们将上面的汇总成一张表,如下:

9611a4a3bea4b481989f8433f37601a0.png

十、Spring事务中的传播行为?

1.  PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。(默认的)

2. PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。

3. PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4. PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。

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

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

7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。

290f7b60c258972785f36aa81c31f9bf.png扫码关注 01bb5e742696b6e724b194f0fe150309.png
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值