Spring AOP面试题汇总

AOP的概念是什么?它解决什么问题?
面向方面的编程(AOP)是某些应用程序的另一种方式,即诸如安全性,日志记录和事务之类的交叉关注点。AOP是针对不同问题的OOP编程的简单补充。在OOP中,模块化的关键单元是类,而在AOP中,模块化的单元是方面。

面向方面的编程(AOP)可以将跨领域关注点模块化,以解决以下问题。

  • 解构
  • 消除散射

遵循应用程序中许多地方所需的通用功能

  • 记录和追踪
  • 交易管理
  • 安全
  • 快取
  • 错误处理
  • 性能监控
  • 自定义业务规则

AOP术语

  • Aspect:方面
  • Joint Point联合点
  • Advice:增强,忠告
  • Pointcut:切入点
  • Introduction:引入,介绍
  • Target Object:目标对象
  • AOP proxy:AOP代理
  • Weaving: 织造

2.什么是切入点,连接点,建议,方面,编织,简介,目标对象,AOP代理?
Pointcut
–选择一个或多个Join Points的表达式
Join Point
–程序执行中的一个点,例如方法调用或抛出的异常
Advice
–将在每个选定的Join Point上执行的代码
Aspect
–封装切入点和建议的模块
Weaving:编织
–将方面与主要代码结合的技术
Introduction:简介
-Spring AOP允许向任何对象建议引入新的接口(和相应的应用程序)。
Target Object:目标对象
-一个对象有一个或多个方面的辅助。也称为对象建议。
AOP代理
-AOP代理是用于执行合同区域的对象。该对象由AOP框架创建。在Spring AOP代理中,它是JDK动态代理或代理CGLIB的一部分。

3. Spring如何解决(实现)跨领域问题?

  • 实施您的主线应用程序逻辑
    • –关注核心问题
  • 编写方面来实现您的跨领域关注点
    • – Spring提供了许多现成的方面
  • 将方面编织到您的应用程序中
    • –将交叉行为添加到正确的位置

4.两种代理类型的局限性是什么?
Spring将创建JDKCGLib代理

  1. JDK代理
    1. 也称为动态代理
    2. API内置在JDK中
    3. 要求:Java接口
    4. 代理所有接口
  2. CGLib代理
    1. 未内置到JDK中
    2. 包含在Spring Jars中
    3. 当接口不可用时使用
    4. 不能应用于final关键字修饰的类或方法

 

5. Spring支持多少种增强类型。它们是用来干什么的?

  • before advice:在连接点之前执行的建议,但是它不能阻止执行流程继续进行到连接点(除非它引发异常)。
  • after returning advice:连接点正常完成后要执行的建议:例如,如果某个方法返回而没有引发异常。
  • after throwing advice:如果方法因抛出异常而退出,则执行建议。
  • after advice:无论连接点退出的方式如何(正常或特殊收益),均应执行咨询。
  • around advice:围绕连接点的建议,例如方法调用。这是最有力的建议。周围建议可以在方法调用之前和之后执行自定义行为。它还负责选择是返回连接点还是通过返回其自身的返回值或引发异常来捷径建议的方法执行。

6.您需要做什么才能启用@Aspect注释的检测?
要在Spring配置中使用@AspectJ方面,您需要启用Spring支持以基于@AspectJ方面配置Spring AOP,并根据这些方面是否建议将它们自动代理。

通过Java配置
启用@AspectJ支持要通过Java @Configuration启用@AspectJ支持,请添加@EnableAspectJAutoProxy批注:

@component
@EnableAspectJAutoProxy
public class AppConfig {

}


通过XML配置启用@AspectJ支持

要使用基于XML的配置启用@AspectJ支持,请使用<aop:aspectj-autoproxy />元素:

 
<aop:aspectj-autoproxy />

7.列举三个典型的横切关注点?

  1. 日志
  2. 安全
  3. 交易

8.如果不通过AOP解决跨领域问题,会出现两个问题?
在没有模块化的情况下实现交叉切割关注点
•未能对交叉切割关注点进行模块化会导致两件事
–代码纠缠
•关注点耦合
–代码分散
•相同的关注点分散在模块中问题1:纠结

 

<span style="color:#000000">公共类RewardNetworkImpl实现了RewardNetwork {
公共RewardConfirmation rewardAccountFor(餐厅){
<strong>
//非生产性代码或非功能性代码满足业务需求
如果(!hasPermission(SecurityContext.getPrincipal()){
抛出新的AccessDeniedException();
}
</strong>
帐户a = accountRepository.findByCreditCard(…
餐馆r = restaurantRepository.findByMerchantNumber(…
MonetaryAmount amt = r.calculateBenefitFor(帐户,就餐);
…
}
}
</span>

问题2:散射

<span style="color:#000000">公共类JpaAccountManager实现AccountManager {
公共帐户getAccountForEditing(Long id){
<strong>
//非生产性代码或非功能性代码满足业务需求
如果(!hasPermission(SecurityContext.getPrincipal()){
抛出新的AccessDeniedException();
}
</strong>
…
公共类JpaMerchantReportingService
实现MerchantReportingService {
公共列表<DiningSummary> findDinings(String商人编号,
DateInterval间隔){
<strong>
//满足业务需求的非生产性代码或非功能性代码-在整个应用程序中重复
如果(!hasPermission(SecurityContext.getPrincipal()){
抛出新的AccessDeniedException();
}
</strong>
…
</span>

9. @EnableAspectJAutoProxy做什么?
要使用Java @Configuration启用@AspectJ支持,请添加@EnableAspectJAutoProxy 注解:

<span style="color:#000000">@组态
@EnableAspectJAutoProxy
公共类AppConfig {

}
</span>

10.什么是命名切入点?
可以在<aop:config>元素内声明命名的切入点,从而使切入点定义可以在多个方面和增强程序之间共享。

<span style="color:#000000"><aop:config>
    <aop:pointcut id =“ businessService” expression =“ execution(* com.xyz.myapp.service。*。*(..))” />
</ aop:config>
</span>

11.您如何外部化切入点?这样做的好处是什么?
将切入点外部化为命名切入点。避免在整个应用程序中编写复杂的切入点表达式。

12. JoinPoint参数用于什么?
JoinPoint参数提供的上下文以及有关截取点的上下文。

13.什么是ProceedingJoinPoint?
周围建议是一种特殊建议,可以控制何时以及是否执行方法(或其他连接点)。仅对于周围建议这是正确的,因此它们需要ProceedingJoinPoint类型的参数,而其他建议仅使用普通的JoinPoint。ProceedingJoinPoint用作方法的参数,这些方法在抛出之前,之后,之后以及前后暗示。ProceedingJoinPoint具有getKind,getTarget,proce等方法。

14.五个增强类型分别是什么?

  • before
  • after
  • after throwing
  • after return
  • around

15.如果您想尝试捕获异常,必须使用哪些建议?
after throwing

16. Spring AOP的局限性?

  • 只能增强非私有方法
  • 只能将方面应用于Spring Beans
  • 代理织入的局限性
    • 使用代理时,假设方法a()在同一类/接口上调用方法b()
  • 增强永远不会为方法b()执行

17. Spring AOP中受支持的AspectJ切入点指示符是什么?

  • Execution
  • This
  • Target
  • args
  • @target
  • @args
  • @within
  • @annotation

18.如何在Spring AOP中声明外观?
在XML中。

<span style="color:#000000"><bean class =“ com.doj.aop.LoggingAspect” id =“ loggingAspect”>
<!-在这里配置方面的属性->
</ bean>
</span>

在Java中

<span style="color:#000000">@方面
@零件
LoggingAspect类{
//建议
//切入点 
}
</span>

19.如何在Spring AOP中声明切入点?
找到以下代码段。

<span style="color:#000000">@Pointcut(“ execution(* save(..))”)
私人无效dataSave {}
</span>

20.您对Spring的加载时织入(LTW)有什么了解?
加载时织入(LTW)或运行时织入是在JVM中加载类时将AspectJ方面编织到应用程序类中的过程。

发布了933 篇原创文章 · 获赞 388 · 访问量 281万+

猜你喜欢

转载自blog.csdn.net/kingmax54212008/article/details/104121212