AOP底层原理
------------恢复内容开始------------
不通过修改源代码方式增加新功能
1.AOP底层使用动态代理:他有两种情况动态代理
a:有接口情况,使用JDK动态代理
b:没有接口情况,使用CGLIB动态代理
a:有接口情况,使用JDK动态代理:他的方法是,在有接口和接口实现类的情况下,如果想要增强接口实现类里的功能,那么就创建接口实现类代理对象,通过代理对象来增强类里的方法功能
b:没有接口情况,使用CGLIB动态代理:只是基本的类和方法,使用CGLIB动态代理,创建当前类子类的代理对象
AOP(JDK动态代理):使用JDK动态代理,使用Proxy类里面的方法创建出代理对象
调用newProxyInstance()方法,方法有三个参数分别是(类加载器、增强方法所在类,这个类实现的接口,支持多个接口、实现这个接口InvocationHandle,创建代理对象,写增强的方法)
编写JDK动态代理演示:
(1)第一步创建接口(UserDao),并写上定义若干方法;
(2)创建接口实现类(UserDaoImpl),实现方法
(3)创建类(JDKProxy),并使用引用Proxy类创建接口代理对象
Class[] interface={UserDao.class}
使用Proxy.newProxyInstance(JDKProxy.class.getClassLoader(),interface,new InvocationHandle())
或者最后一个参数不用匿名对象,而是单独写一个类来实现这个接口InvocationHandle
invoke()写增强的逻辑部分
AOP操作术语:
1.连接点:类里面哪些方法可以被增强,这些方法称为连接点
2.切入点:实际被增强的方法是切入点:
3.通知(增强):实际增强的逻辑部分称为通知;
通知有多种类型:前置通知、后置通知、环绕通知、异常通知、最终通知
4.切面:是动作,把通知应用到切入点的过程
AOP操作准备:Spring框架一般基于AspectJ实现AOP操作,
实现方式:基于XML配置文件实现、基于注解方式实现(常用)
在项目工程引入AOP相关依赖,
切入点表达式:知道哪个类里面的哪个方法增强
语法结构:execution([权限修饰符][返回类型][类全路径][方法名称]([参数列表]))
举例1:对com.atguigu.dao包中BookDao类里的add方法进行增强,
execution(* com.atguigu.dao.BookDao.add(..)) //用*表示任意修饰符都可以,..表示参数
举例2:对com.atguigu.dao包中BookDao类里的所有方法进行增强,
execution(* com.atguigu.dao.BookDao.*(..)) //这里*表示所有方法
举例3:对com.atguigu.dao包中所有类,类中所有方法进行增强,
execution(* com.atguigu.dao.*.*(..))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App