public void update() {
daoProxy.update();
}
public void query() {
daoProxy.query();
}
}
- controller层
public class Controller {
public static void main(String[] args) {
Service1 service = new Service1();
service.add();
service.delete();
service.update();
service.query();
}
}
动态代理
动态代理和静态的代理的角色分布是一样的
动态代理的代理类是动态生成的, 不是我们直接写好的
动态代理分为俩大类 : 基于接口的动态代理, 基于类的动态代理
-
基于接口的: 如JDK动态代理
-
基于类: 如cglib
-
java字节码实现: 如javasist
下面主要演示基于接口的动态代理, 需要知道Proxy:代理和InvocationHandler: 调用动态管理程序 这俩个类
动态代理有静态代理的所有好处, 还有一个额外的好处就是
-
一个动态代理 代理的是一个接口, 可以代理一类业务
-
一个动态代理可以代理多个类, 只要实现同一个接口就行, 动态代理就会通过反射这个类,得到一个动态代理的类
演示
Proxy和InvocationHandler的官方文档
https://docs.oracle.com/javase/9/docs/api/java/lang/reflect/Proxy.html
https://docs.oracle.com/javase/9/docs/api/java/lang/reflect/InvocationHandler.html
- 文档中的实例和注解很详细, 比如给出的伪代码
-
也就是只需要一个实现了InvocationHandler接口的类重写其invoke方法, 使用在Proxy的静态方法newProxyInstance获取到一个代理类.
-
我们在使用newProxyInstance需要传入被代理对象的ClassLader,和interfaces还有我们实现InvocationHandler接口的类
-
当要执行代理类中的方法时, 就会被分配到invoke方法, 这时, 你就可以增加额外的操作, 使用method.invoke就会执行被代理类中的方法
-
动态代理类
//每个代理实例都有一个关联的调用处理程序。
// 在代理实例上调用方法时,该方法调用将被编码并分派到invoke 其调用处理程序的方法。
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getTarget() {
//通过Proxy的静态方法得到代理接口的代理类
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
//实现代理并返回结果
//其关联的代理实例上调用方法时,将在调用处理程序上调用该方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
//调用invoke方法会经过反射 处理被代理实例中的代码
Object ret = method.invoke(target, args);
end(method.getName());
return ret;
}
private void end(String name) {
System.out.println(“[OVER]” + name);
}
private void log(String name) {
System.out.println(“[DEBUG]” + name);
}
}
- 演示: 动态代理的框架
package dyAgent;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
-
Created with IntelliJ IDEA.
-
Description: If you don’t work hard, you will be a loser.
-
User: Listen-Y.
-
Date: 2020-10-23
-
Time: 16:06
*/
//每个代理实例都有一个关联的调用处理程序。
// 在代理实例上调用方法时,该方法调用将被编码并分派到invoke 其调用处理程序的方法。
public class MyInvocationHandler implements InvocationHandler {
private Object target;
public void setTarget(Object target) {
this.target = target;
}
public Object getTarget() {
//通过Proxy的静态方法得到代理接口的代理类
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
//实现代理并返回结果
//其关联的代理实例上调用方法时,将在调用处理程序上调用该方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
//调用invoke方法会经过反射 处理被代理实例中的代码
Object ret = method.invoke(target, args);
end(method.getName());
return ret;
}
private void end(String name) {
System.out.println(“[OVER]” + name);
}
private void log(String name) {
System.out.println(“[DEBUG]” + name);
}
}
public class Demo {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/0413c9c721a2138ccabe1a799421ce5a.jpeg)
Kafka实战笔记
关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图
- Kafka入门
- 为什么选择Kafka
- Karka的安装、管理和配置
- Kafka的集群
- 第一个Kafka程序
afka的生产者
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
- Kafka实战之削峰填谷
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
1)]
[外链图片转存中…(img-loijxRcy-1712688525801)]
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
[外链图片转存中…(img-YAZpAwde-1712688525802)]
- Kafka实战之削峰填谷
[外链图片转存中…(img-IouDJF1f-1712688525802)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!