博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringAop两种代理模式-源码分析
阅读量:3932 次
发布时间:2019-05-23

本文共 1154 字,大约阅读时间需要 3 分钟。

1.什么情况下是Cglib动态代理和JDK动态代理?

这个类就可以找到答案:org.springframework.aop.framework.DefaultAopProxyFactory

由源码可得:

JDK动态代理:当代理类为接口时采用Jdk动态代理
Cglib动态代理:cglib是针对类来实现代理的
在这里插入图片描述

2.jdk动态代理为什么必须是基于接口实现的?

可做这么一个操作: 模拟Aop源码中生成JDK动态代理对象的字节码方法

创建一个Service接口

package com.sol.springframework.service;import com.sol.springframework.pojo.LoginUser;/*** @author: lujie* @create: 2020/3/24* @description: LoginService**/public interface LoginService {
/** * 模拟登陆方法 * @param id * @return */ LoginUser login(Long id);}

生成字节码对象文件

public static void main(String[] args) {
Class
[] interfaces = new Class[]{
LoginService.class} ; byte[] bytes = ProxyGenerator.generateProxyClass("LoginService", interfaces); File file = new File("F:\\LoginService$Proxy.class") ; FileOutputStream fo = null; try {
fo = new FileOutputStream(file); fo.write(bytes); fo.flush(); fo.close(); } catch (Exception e) {
e.printStackTrace(); } }

生成的文件如下:

在这里插入图片描述

将生成的字节码放入IDEA targe目录中查看内容

可以明显的看到class文件已经继承了Proxy,java是单一继承的,可以多实现的,所以不能继承目标对象,只能实现目标对象接口,所以jdk动态代理是基于接口而不是继承实现的。

在这里插入图片描述

转载地址:http://nuqgn.baihongyu.com/

你可能感兴趣的文章
SemEval2019Task3_ERC | (1) Affect Classification in Dialogue using Attentive BiLSTMs
查看>>
SemEval2019Task3_ERC | (2) Attentive Conversation Modeling for Emotion Detection and Classification
查看>>
SemEval2019Task3_ERC | (3) Using Deep Sentiment Analysis Models and Transfer Learning for ERC
查看>>
SemEval2019Task3_ERC | (4) Emotion detection in conversations through Tweets,CNN and LSTM DNN
查看>>
Python杂谈 | (15) 使用Pycharm执行带命令行参数的脚本
查看>>
从源码分析:分析Java中的StringBuilder
查看>>
Linux(Ubuntu18)中启动ssh时的报错
查看>>
Java中的左移时的负数问题
查看>>
从数组形式创建一棵树(用于leetcode测试)
查看>>
线程进阶:多任务处理(17)——Java中的锁(Unsafe基础)
查看>>
Spring/Boot/Cloud系列知识(1)——开篇
查看>>
线程基础:多任务处理(15)——Fork/Join框架(要点2)
查看>>
线程基础:多任务处理(16)——Fork/Join框架(排序算法性能补充)
查看>>
线程基础:多任务处理(14)——Fork/Join框架(要点1)
查看>>
架构设计:系统存储(13)——MySQL横向拆分与业务透明化(1)
查看>>
架构设计:系统存储(14)——MySQL横向拆分与业务透明化(2)
查看>>
架构设计:系统存储(5)——MySQL数据库性能优化(1)
查看>>
架构设计:系统存储(2)——块存储方案(2)
查看>>
架构设计:系统间通信(45)——阶段性问题记录
查看>>
架构设计:系统间通信(44)——自己动手设计ESB(5)
查看>>