先说结论,aop 底层是采用动态代理机制实现的:接口+实现类
如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy ,去创建代理对 象。没有实现接口的对象,就无法使用 JDK Proxy 去举行代理了,这时间 Spring AOP 会使用 Cglib 天生一个被代理对象的子类来作为代理。
SpringAop默认使用JDK动态代理;
Spring Boot选择CGLIB作为默认代理模式,是为了提供更广泛和灵活的代理支持,同时确保更高的性能和更好的AOP支持。
实现方式
Spring AOP的实现基于代理模式,主要有两种方式:JDK动态代理和CGLIB代理。
- JDK动态代理:用于代理实现了接口的类。Spring使用java.lang.reflect.Proxy类来创建代理对象,并通过InvocationHandler处理惩罚代理方法的调用。
- CGLIB代理:用于代理没有实现接口的类或final类。CGLIB(Code Generation Library)是一个代码天生的库,在运行时动态天生目的类的子类来举行方法的拦截和加强。
核心概念:
切面是一种高出多个对象的关注点,它会将被横切的代码(通常是方法)抽象成一个独立的模块。在Spring AOP中,切面由切点和建议(advice)构成。切面定义了在何处和何时应用建议。
切点是一组匹配连接点(Join Point)的表达式。通常情况下,连接点是方法的实验,但也可以是字段、异常处理惩罚和构造函数调用等。切点决定了切面在何时实验。
通知是切面在切点上实验的动作。Spring AOP提供了四种类型的建议:
前置通知(Before Advice): 在目的方法调用之前实验。
后置通知(After Advice): 在目的方法调用之后实验。
返回通知(After Returning Advice): 在目的方法乐成返回之后实验。
异常通知(After Throwing Advice): 在目的方法抛出异常之后实验。
环绕通知(Around Advice):将目的方法封装起来
连接点表如今应用步伐运行过程中可以插入切面的点,比如方法调用。连接点是AOP中的步伐实验点。
引入允许切面在不修改对象源代码的情况下向对象添加新的方法和属性。引入是在切面中定义接口的实现,该接口将被目的对象实现。
织入是将切面应用到目的对象并创建新的代理对象的过程。Spring AOP支持三种织入方式:
1)编译时织入(Compile-time weaving):在编译期间将切面织入到目的类中。
2)类加载时织入(Load-time weaving):在目的类加载到虚拟机时将切面织入。
3)运行时织入(Runtime weaving):在目的对象被创建时将切面织入。
AOP框架种类
- AspectJ
- JBoss AOP
- Spring AOP
使用 AOP 场景
- 性能监控:在方法调用前后记录调用变乱,方法实验太长或超时报警。
- 缓存代理:缓存某方法的返回值,下次实验该方法时,直接从缓存里获取。
- 软件破解:使用AOP修改软件的验证类的判断逻辑。
- 记录日志:在方法实验前后记录体系日志。
- 权限验证:方法实验前验证是否有权限实验当火线法,没有则抛出没有权限实验异常,由业务代码捕获。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |