简述:
Spring AOP(Aspect-Oriented Programming,面向切面编程)是 Spring 框架的一个重要特性,它允许开发者通过定义切面(Aspect)来实现横切关注点(Cross-cutting Concerns)的模块化。横切关注点是指那些影响多个类的行为,如日志记录、事务管理、安全性检查等。
核心概念:
-
切面(Aspect):
切面是一个模块化的单元,包含了通知(Advice)和切点(Pointcut)。切面用于定义在何时、何处应用横切关注点。
-
通知(Advice):
通知定义了切面在特定连接点(Join Point)上执行的动作。Spring 支持多种类型的通知,包括前置通知(Before)、后置通知(After)、返回通知(After-returning)、异常通知(After-throwing)和环绕通知(Around)。
-
切点(Pointcut):
切点定义了通知应该在哪些连接点上执行。切点通过表达式来匹配特定的方法调用或类实例化等。
-
连接点(Join Point):
连接点是程序执行过程中的一个特定点,如方法调用、异常抛出等。在 Spring AOP 中,连接点总是代表方法执行。
-
引入(Introduction):
引入允许向现有的类添加新的方法或属性。Spring AOP 允许你为 Bean 引入新的接口及其实现。
-
目标对象(Target Object):
目标对象是被一个或多个切面通知的对象。也称为被通知对象。
-
AOP 代理(AOP Proxy):
Spring AOP 使用 JDK 动态代理或 CGLIB 代理来实现切面。在运行时,AOP 代理会拦截方法调用,并在必要时应用通知。
-
织入(Weaving):
织入是将切面应用到目标对象以创建新的代理对象的过程。织入可以在编译时、加载时或运行时进行。Spring AOP 在运行时进行织入。
使用场景:
-
日志记录:在方法调用前后记录日志。
-
事务管理:在方法调用前后开启和提交事务。
-
安全性检查:在方法调用前进行权限验证。
-
性能监控:记录方法的执行时间。
-
缓存管理:在方法调用前后进行缓存操作。
总结:
Spring AOP 提供了一种强大的机制来模块化横切关注点,使得代码更加清晰和易于维护。通过使用切面、通知和切点,开发者可以专注于业务逻辑,而将横切关注点分离出来,提高代码的模块化和可重用性。
动态代理技术
简述:
Spring AOP(Aspect-Oriented Programming,面向切面编程)通过动态代理技术来实现横切关注点的模块化。动态代理允许在运行时创建代理对象,这些代理对象在调用目标对象的方法时,可以应用切面逻辑。Spring AOP 支持两种主要的动态代理技术:JDK 动态代理和 CGLIB 代理。
-
JDK 动态代理:
JDK 动态代理是基于接口的代理技术。它要求目标对象必须实现一个或多个接口。JDK动态代理通过(java.lang.reflect.Proxy)类和(java.lang.reflect.InvocationHandler)接口来实现。
-
CGLIB 代理:
CGLIB(Code Generation Library)代理是基于类的代理技术。它不需要目标对象实现接口,而是通过生成目标类的子类来实现代理。CGLIB 使用 net.sf.cglib.proxy.Enhancer 类来创建代理对象。
注意:Spring AOP 默认使用 JDK 动态代理,但如果目标对象没有实现接口,Spring 会自动切换到 CGLIB 代理。可以通过配置强制使用 CGLIB 代理。
总结:
Spring AOP 通过动态代理技术实现了横切关注点的模块化,使得开发者可以专注于业务逻辑,而将横切关注点分离出来。JDK 动态代理基于接口,适用于目标对象实现了接口的情况;CGLIB 代理基于类,适用于目标对象没有实现接口的情况。Spring AOP 根据目标对象的特性自动选择合适的代理技术,也可以通过配置强制使用 CGLIB 代理。