您的位置:

AOP面试题详解

在Java开发中,AOP(Aspect Oriented Programming)是一种编程范式,它可用于将跨越应用程序中的多个模块和方法的横切关注点分离出来。AOP 可以帮助将业务逻辑和基础设施细节解耦,提高代码的可读性和可维护性,达到更好的软件设计,因此被Java开发者广泛使用。本文将围绕着AOP面试题进行详解,分别从基础概念、使用场景、框架等方面进行阐述。

一、 AOP基础概念

1、什么是AOP?

AOP是面向切面编程,允许开发人员定义一些类似"切面"的模块,然后将它们应用到多个类、方法和函数中。

2、AOP是如何实现的?

AOP框架通常通过在程序编译时或运行时对类进行动态处理,来实现应用切面。比较好的实现方式是使用JVM工具,例如字节码增强。

3、AOP术语介绍?

1)切面(Aspect):体现为一些通用的代码,可用来在一个应用中的多个位置进行切入(或者调用)。切面可定义为类,其中包含了需要在应用某个位置进行切入的方法。 

2)连接点(Join Point):在应用程序执行的过程中,某个点在代码中的位置。通常,是对方法执行进行切面操作。 

3)通知(Advice):在应用程序执行过程中在某个连接点处进行执行的代码。 

4)切点(Pointcut):连接点的集合。与正则表达式类似,切点确定了某个通知和一系列连接点之间的匹配规则。 

5)织入(Weaving):将切面与其他对象结合起来形成新的功能的过程。 

6)引入(Introduction):在不修改代码的情况下,对现有类进行修改的术语 已用于实施新的接口和域。

二、 AOP框架

1、Spring AOP

Spring AOP采用的是动态代理的机制。AOP代理类完成对被代理类的方法进行拦截,根据自定义的增强规则,嵌入其他的代码;有两种代理方式:JDK动态代理和CGLIB代理。

2、AspectJ

AspectJ通常需要编写额外的代码,以便在程序编译时创建新的类,用于在运行时实施AOP。 AspectJ是静态编织-AOP解决方案,通过增强字节码文件间接实现AOP。 

3、Jboss AOP

JBoss AOP是专门为J2EE环境设计的AOP框架,支持POJO和EJB之间的AOP实现。它使用Aspect、Join-point和Advice来实现自定义程序结构的创造性编程。

三、 AOP使用场景

1、日志记录

一些比较复杂的系统往往需要记录运行过程中的日志,同时,记录日志的功能应该独立于应用程序本身的业务逻辑,使用AOP技术我们可以通过将所有的日志记录功能,封装到AOP中,让业务代码不需要关注日志记录,只需要调用相关的API即可。 

2、性能监控

在一些需要对复杂的方法进行性能监控和优化的系统中,AOP往往会发挥很大的作用。比如:对于循环调用次数较多,耗时较长的方法等等,可以通过方法拦截+计时器等方式完成时间监控,使得性能有了极大的提升。

3、安全检查

在一些应用程序需要进行安全性检查的时候,可以将这些代码也封装到AOP中,以便在运行过程中快速定位安全漏洞,同时,这种方式还能在不影响程序性能的情况下,完成安全检查的任务。

四、 AOP面试题

1、AOP概念与实现方式?

AOP是面向切面编程,允许开发人员定义一些类似"切面"的模块,然后将它们应用到多个类、方法和函数中,以实现对一些关键方法的拦截和监控等功能。AOP采用的方式一般有两种,静态编织和动态编织。 

2、Spring AOP和AspectJ的区别是什么?

关于Spring AOP和AspectJ的区别,可以总结为以下几点:

1)编程方式不同: Spring AOP采用基于代理的方式,AspectJ支持静态织入和动态代理。 

2)适应范围不同: Spring AOP适用于轻量级应用,并支持IOC和DI机制;而AspectJ更适用于大型分布式系统,对运行效率有较高的要求。 

3)支持的范围不同: AspectJ可在更广泛的范围内实现AOP,包括构造函数、类初始化以及静态方法等;而Spring AOP只支持方法级别的AOP。

3、AOP面向的主要切点有哪些?

在AOP中,切点是指我们需要对代码进行拦截或者注入的关键代码点。主要的切点有:前置切点、后置切点、环绕切点和异常切点。

4、Spring AOP有哪些常见的AOP通知类型?

常见的Spring AOP通知类型包括:前置通知(Before)、后置通知(After)、异常抛出通知(After-throwing)、后置返回通知(After-returning)、环绕通知(Around)。

5、Spring AOP和AspectJ的区别是什么?

关于Spring AOP和AspectJ的区别,可以总结为以下几点:

1)编程方式不同: Spring AOP采用基于代理的方式,AspectJ支持静态织入和动态代理。 

2)适应范围不同: Spring AOP适用于轻量级应用,并支持IOC和DI机制;而AspectJ更适用于大型分布式系统,对运行效率有较高的要求。 

3)支持的范围不同: AspectJ可在更广泛的范围内实现AOP,包括构造函数、类初始化以及静态方法等;而Spring AOP只支持方法级别的AOP。

五、代码实现示例

以下示例基于Spring AOP框架进行演示。

1、创建一个切面类

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {
    @Pointcut("execution(public * com.example.demo.controller..*.*(..))")
    public void pointCut(){}

    @Before("pointCut()")
    public void before(){
        System.out.println("方法执行前...");
    }

    @After("pointCut()")
    public void after(){
        System.out.println("方法执行后...");
    }
}

2、在Spring配置文件中配置切面

  


3、在目标类中使用AOP功能

@RestController
@RequestMapping("/test")
public class TestController {

    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String hello() {
        System.out.println("执行了hello方法");
        return "hello";
    }
}

4、运行程序并查看控制台输出

INFO 12732 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initialized Servlet 'dispatcherServlet'
方法执行前...
执行了hello方法
方法执行后...

总结

本文围绕AOP面试题进行了详细的解析,包括AOP基础概念、使用场景、AOP框架以及一些面试常见问题等。通过本文的学习,相信读者对AOP技术的认识更加深入,能够更好的应用于实际开发中,提高软件系统的设计质量和可维护性。