AOP
AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
目前已有的几款AOP框架技术:
- AspectJ:基于源代码和字节码解包的一个编织器,用户需要使用的时候用到一门新的语言,因此Spring的Aop对AspectJ进行了一次封装。
- AspectWerkz:AOP 框架,使用字节码动态编织器和 XML 配置
- JBoss-AOP:基于拦截器和元数据的 AOP 框架,运行在 JBoss 应用服务器上,以及 AOP 中用到的一些相关技术实现
- Javassist:Java 字节码操作类库,JBoss 的一个子项目
Aspect(切面)==》【可以理解为是将业务代码抽出来的一个类】
@Aspect
public class LogAspect {
/** ... 这里面是相关方法的部分 省略大部分内容 ... **/
}
JoinPoint(连接点)
Spring框架目前只支持方法级别的拦截,其实aop的连接点还可以有多种方式,例如说参数,构造函数等等。
PointCut(切入点)===》可以理解为对各个连接点进行拦截
Advice(通知)====》指拦截到连接点之后需要执行的代码
分为了前置,后置,异常,环绕,最终
cglib和jdk代理
cglib的代理模式和jdk实现的代理技术本质还是会有较大差异性,jdk要求被代理对象需要实现jdk内部的InvocationHandler接口才能进行接口回调操作,但是cglib对是否实现接口方面没有强制要求,而且其性能也比JDK自带的代理要高效许多。
(1)首先需要定义相关的注解:
package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author linhao
* @Date created in 3:49 下午 2021/5/6
*/
@Retention(value = RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Pointcut {
String value() default "";
}
package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author linhao
* @Date created in 3:42 下午 2021/5/6
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Before {
String value();
}
package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author linhao
* @Date created in 3:43 下午 2021/5/6
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface After {
String value();
}
package org.idea.spring.aop.version1.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Author linhao
* @Date created in 3:41 下午 2021/5/6
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Aspect {
String value() default "";
}
package org.idea.spring.aop.version1.aspect;
import org.idea.spring.aop.version1.annotation.After;
import org.idea.spring.aop.version1.annotation.Aspect;
import org.idea.spring.aop.version1.annotation.Before;
import org.idea.spring.aop.version1.annotation.Pointcut;
import java.lang.reflect.Method;
/**
* 切面
*
* @Author linhao
* @Date created in 3:43 下午 2021/5/6
*/
@Aspect
public class MyAspect {
@Pointcut("org.idea.spring.aop.version1.test.*.*(..)")
public void pointCut(){
}
@Before("pointCut()")
public void doBefore(Method method, Object object){
System.out.println("doBefore");
}
@After("pointCut()")
public void doAfter(Method method, Object object){
System.out.println("doAfter");
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战