前置条件

其实考虑这个问题的时候必须知道springaop 中存在2中代理,一个是jdk代理,一个cglib代理,并且这两者是有区别的,首先知道的一点,jdk代理是目标对象实现接口,也就是说jdk代码是基于接口的方式
同样一个问题:jdk代理,目标对象能继承一个父类,而不实现接口吗?为什么?

jdk代理生成代理对象

这里我们编写一生成的代码片段如下截图

public class Test {public static void main(String[] args) throws IOException {byte[] wfgClasses = ProxyGenerator.generateProxyClass("wfgClass", new Class[]{UserDao.class});File wfgClasses1 = new File("/Users/wufagang/wfgClass.class");System.out.println(wfgClasses1.getPath());OutputStream out = new FileOutputStream(wfgClasses1);out.write(wfgClasses);out.flush();out.close();}
}

生成的代理对象的class文件如下

public final class wfgClass extends Proxy implements UserDao {private static Method m1;private static Method m3;private static Method m2;private static Method m0;public wfgClass(InvocationHandler var1) throws  {super(var1);}public final boolean equals(Object var1) throws  {try {return (Boolean)super.h.invoke(this, m1, new Object[]{var1});} catch (RuntimeException | Error var3) {throw var3;} catch (Throwable var4) {throw new UndeclaredThrowableException(var4);}}public final void saveUser() throws  {try {super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final String toString() throws  {try {return (String)super.h.invoke(this, m2, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final int hashCode() throws  {try {return (Integer)super.h.invoke(this, m0, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}static {try {m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));m3 = Class.forName("com.wfg.aop2.UserDao").getMethod("saveUser");m2 = Class.forName("java.lang.Object").getMethod("toString");m0 = Class.forName("java.lang.Object").getMethod("hashCode");} catch (NoSuchMethodException var2) {throw new NoSuchMethodError(var2.getMessage());} catch (ClassNotFoundException var3) {throw new NoClassDefFoundError(var3.getMessage());}}
}

总结: public final class wfgClass extends Proxy implements UserDao {
由此可以看到生成的代理对象继承Proxy类,实现我们定义的接口,java语言又是单继承的,所以jdk代理必须是实现接口不能是继承类

aop中this和target的区别

this表示代理对象
target表示目标对象

4.this JDK代理时,指向接口和代理类proxy,cglib代理时 指向接口和子类(不使用proxy)

5.target 指向接口和子类

此处需要注意的是,如果配置设置proxyTargetClass=false,或默认为false,则是用JDK代理,否则使用的是CGLIB代理

  • JDK代理的实现方式是基于接口实现,代理类继承Proxy,实现接口。
    • 而CGLIB继承被代理的类来实现。
  • 所以使用target会保证目标不变,关联对象不会受到这个设置的影响。
  • 但是使用this对象时,会根据该选项的设置,判断是否能找到对象。
    @Pointcut(“target(com.chenss.dao.IndexDaoImpl)”)
    //目标对象,也就是被代理的对象。限制目标对象为com.chenss.dao.IndexDaoImpl类@Pointcut(“this(com.chenss.dao.IndexDaoImpl)”)
    //当前对象,也就是代理对象,代理对象时通过代理目标对象的方式获取新的对象,与原值并非一个

这个比较难…proxy模式里面有两个重要的术语proxy Classtarget
ClassCGLIB和JDK有区别 JDK是基于接口 cglib是基于继承所有this可以在cglib作用

代码演示

这几天学习这一块我们应该可以很快写出来下面的代码没有难点

package com.wfg.aop2.dao;/*** @author wufagang* @description* @date 2021年04月24日 3:03 下午*/
public interface IndexDao {public void saveUser(String user);
}
package com.wfg.aop2.dao;import org.springframework.stereotype.Service;/*** @author wufagang* @description* @date 2021年04月24日 3:03 下午*/
@Service
public class IndexDaoImpl implements IndexDao {@Overridepublic void saveUser(String user) {System.out.println("save user" + user);}
}
package com.wfg.aop2;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;/*** @author wufagang* @description* @date 2021年04月24日 3:08 下午*/
@Configuration
@ComponentScan("com.wfg.aop2")
@EnableAspectJAutoProxy(proxyTargetClass=false)
public class AppConfig {}
package com.wfg.aop2;import com.wfg.aop2.dao.IndexDao;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;/*** @author wufagang* @description* @date 2021年04月24日 3:06 下午*/
@Aspect
@Component
public class IndexAspect {@Before("this(com.wfg.aop2.dao.IndexDaoImpl)")public void before(){System.out.println("before==============");}@After("target(com.wfg.aop2.dao.IndexDaoImpl)")public void after(){System.out.println("after==============");}
}
package com.wfg.aop2;import com.wfg.aop2.dao.IndexDao;
import com.wfg.aop2.dao.IndexDaoImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.lang.reflect.Proxy;/*** @author wufagang* @description* @date 2021年04月24日 3:09 下午*/public class Test2 {public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);IndexDao bean = context.getBean(IndexDao.class);System.out.println("类名称:"+bean.getClass().getName());System.out.println("bean instanceof IndexDao :"+(bean instanceof IndexDao));System.out.println("bean instanceof IndexDaoImpl :"+(bean instanceof IndexDaoImpl));System.out.println("bean instanceof Proxy :"+(bean instanceof Proxy));bean.saveUser("zhangsan");}
}

代码测试:
@EnableAspectJAutoProxy(proxyTargetClass=false)

@EnableAspectJAutoProxy(proxyTargetClass=true)

通过上面的结果总结可知:

项目 this是否命中 target是否命中 是否属于Dao 是否属于Impl 是否属于Proxy
jdk代理 命中
cglib代理 命中 命中

深思:
@Before(“this(com.wfg.aop2.dao.IndexDaoImpl)”)我们将这个修改成
@Before(“this(com.wfg.aop2.dao.IndexDao)”) 此时不久可以命中了吗? java本身就是面向接口编程,但是this和target还有其他的区别吗?
目前我理解的修改成@Before(“this(com.wfg.aop2.dao.IndexDao)”)就没啥差别了,验证效果也是一样的。。。
更多的知识后面我们看源码的时候再说吧

spring aop中this和target区别相关推荐

  1. Spring AOP中定义切点PointCut详解

    1.AOP是什么? 软件工程有一个基本原则叫做"关注点分离"(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题.这年 ...

  2. Spring AOP中定义切点(PointCut)和通知(Advice)

    本文讨论一下Spring AOP编程中的两个关键问题,定义切点和定义通知,理解这两个问题能应付大部分AOP场景. 如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子. ...

  3. Spring AOP 中 advice 的四种类型 before after throwing advice around

    Spring  AOP(Aspect-oriented programming) 是用于切面编程,简单的来说:AOP相当于一个拦截器,去拦截一些处理,例如:当一个方法执行的时候,Spring 能够拦截 ...

  4. Spring AOP 中的切点是什么?如何定义切点?

    Spring AOP 中的切点是什么?如何定义切点? 什么是切点? 在 Spring AOP 中,切点(Pointcut)是指一组连接点(Join Point)的集合.连接点是程序执行过程中的某个特定 ...

  5. Spring AOP中@Pointcut切入点表达式详解

    目录 一.瞅一眼标准的AspectJ Aop的pointcut的表达式 二.SpringAop的十一种AOP表达式 三.演示使用 1.execution: 2.within: 3.this: 4.ta ...

  6. Spring AOP中pointcut 切点详解

    Spring AOP中pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方 ...

  7. 聊聊spring aop中的advisor组件

    1.Advisor的组成结构 在spring aop中Advisor是一个接口,代表被拦截方法需要增强的逻辑. Advisor通常由另两个组件组成--Advice接口和Pointcut接口,其中Adv ...

  8. Spring AOP中是如何注册Advisor的?

    前置博文: Spring AOP中如何为Bean创建代理? Spring AOP中是如何注册Advisor的? Spring AOP如何为目标方法创建拦截器链? Spring AOP拦截器调用的实现 ...

  9. spring aop中pointcut表达式

    spring aop中pointcut表达式 本文主要介绍spring aop中9种切入点表达式的写法 execute within this target args @target @within ...

最新文章

  1. Forrester:2011年Q2数据库审计与实时保护市场分析报告【更新】
  2. Docker入门系列8
  3. 【堆叠抓取+深度学习】基于深度学习+PPO深度强化学习的堆叠物体抓取算法的MATLAB仿真
  4. 从mysql高可用架构看高可用架构设计
  5. JavaScript数据迭代方法差别
  6. Spring Data JPA 教程(翻译)
  7. C# 获取Excel中的合并单元格
  8. Cajo,用Java完成分布式计算的最简单方法
  9. Spark Streaming 之foreachRDD 输出
  10. python日期转化利器arrow实践
  11. python 实现微信自动回复(自动聊天)
  12. Fairy GUI 使用
  13. 2020-11-20
  14. Python文件IO基础,看这篇文章就够了!
  15. ailoop2里面的1个待考察的,在ailoop3里面的操作。(先使用海巨人,不使用英雄技能召唤图腾的问题)...
  16. 职场邮件的十大忌讳,你犯了吗?
  17. 网络的可靠性是设计出来的
  18. PCL:点云平移、旋转
  19. 2003年高考数学试题赏析
  20. 都是购买ARM授权,为何高通华为三星联发科的芯片像4个妈生的?

热门文章

  1. 地铁PIS系统SDI接口和HDMI接口应用专题研究报告
  2. iOS12捷径(快捷指令),最新抖音去水印捷径,快手去水印捷径
  3. 解决BASE64Encoder报错的问题
  4. Field XXXService in com.XXX.controller.XXX required a bean of type ‘com.XXX.mapper.xxx‘that could no
  5. 怎样注销计算机的用户帐户,怎样注销电脑管理者
  6. Booking:摩洛哥传统民宅、日式旅馆等道地特色住宿成为全球旅游新趋势
  7. 【直视骄阳】生命的留言
  8. 制作最小linux镜像,Docker镜像的无中生有:使用scratch制作自定义最小镜像
  9. 2021年起重机械指挥实操考试视频及起重机械指挥考试试题
  10. 数据分析总是做不好?你可能需要这个思维框架