主目录见:Android高级进阶知识(这是总目录索引) 今天要讲这个代理设计模式,真的是印象深刻,在好多年前在学校接触java的时候就对这个模式了解过,当初还想着Spring里面的AOP机制是不是就是用代理实现的呀。到现在插件化的hook大量用到代理设计模式。包括等会要讲的retrofit也是用到了代理设计模式。而且Framework的AIDL里面也是用到了代理模式。这些个例子足以证明了你学这个设计模式的理由,不需要我去调动大家,我们先来看看代理模式的定义:
代理模式:为其他对象提供一种代理以控制这个对象的访问。
这个定义简单明显呀,就是说不直接访问对象,而是建一个代理或者说是中间人去访问他,而且这个代理可以选择多带礼物,说祝福等等增强的行为和服务。接着我们看下UML类图:
角色介绍:
Subject :抽象主题,声明代理主题和真实主题的接口;
Proxy :代理主题,因为Proxy引用了RealSubject,并且实现了跟RealSubject一样的接口,所以ProxySubject可以操作RealSubject,还可以提供一些附加操作,例如before & after;
RealSubject :真实主题,真实的对象,需要被代理主题引用。
一.目标
今天讲这个设计模式也是为了后面插件化和热更新做个准备,同时我们还能在必要时候派上用场,特别是retrofit的源码和使用,这个待会就会讲了。所以今天的目标是: 1.学会几种代理设计模式怎么使用; 2.学会在不同的场景中应用代理模式。
二.模式讲解
今天我们也来假设一个场景,比如你现在要去租房,但是呢,又不是自己去一个地方一个地方找,所以你就拜托了中介帮你找,告诉了中介你的要求,然后中介就将你的要求发布在网上,联系了房东,最后你去看了房子。首先我们看下抽象主题:
public abstract class Subject {
public abstract String houseHunting();
}
我们看到抽象主题里面有个找房子的动作。这个是给后面代理主题和真实主题使用的,我们现在来看下真实主题想干嘛:
public class Hunter extends Subject{
@Override
public String houseHunting() {
String info = "我要找一间房子,房子的价格在2000-3000之间三室一厅";
return info;
}
}
我们看到我们的的真实主题是想要找一间房子,然后说了自己的价格。接着我们代理就出现了:
public class Proxy extends Subject{
private Subject subject;
public void setHunter(Subject subject){
this.subject = subject;
}
@Override
public String houseHunting() {
String proxyFare = "我要额外收中介费500块";
String infoFromHunter = subject.houseHunting();
return infoFromHunter +", "+ proxyFare;
}
}
我们看到这里的代理也就是这个中介除了帮你找房子,还要额外再收中介费用。所以代理可以拦截原来的方法然后再增加额外的功能。我们看下这个是怎么使用:
Subject hunter = new Hunter();
Proxy houseAgency = new Proxy();
houseAgency.setHunter(hunter);
String info = houseAgency.houseHunting();
System.out.println(info);
除了这个静态代理,我们java还提供了动态代理机制,我们现在来看看用动态代理是怎么实现代理的。
1.动态代理
同静态代理不同的是,动态代理是通过反射在运行时候生成代理对象的,要实现动态代理,首先我们要注意这里的动态代理有要求就是必须被代理的对象必须是实现一个接口。而且代理对象必须实现InvocationHandler接口。 我们先来看看代理对象:
public class DynamicProxy implements InvocationHandler{
private Subject subject;
public DynamicProxy(Subject subject) {
this.subject = subject;
}
@Override
public String invoke(Object arg0, Method method, Object[] arg2)
throws Throwable {
String proxyFare = "我要额外收中介费500块";
String result = (String) method.invoke(subject,arg2);
return result +", "+ proxyFare;
}
}
我们看到这里实现了InvocationHandler,然后必须实现invoke方法。invoke方法这里包括方法和方法参数。然后我们可以往在原本方法增加附加功能了,比如这里的中介费。调用变成了这样:
Subject hunter = new Hunter();
Subject subject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),
new Class[]{Subject.class}, new DynamicProxy(hunter));
System.out.println(subject.houseHunting());
当然这里的Subject必须是一个接口,不然程序会出错。当然了前面的都是要实现一个接口的,但是有没有不需要被代理对象实现一个接口呢?答案是有的大家可以使用这个库Cglib代理
。具体不会介绍这个库,大家有兴趣可以看看。
2.retrofit中的代理设计模式
如果想要了解retrofit的具体源码可以查看[Retrofit2源码解析],我们知道我们使用retrofit的时候如下:
PhoneService service=retrofit.create(PhoneService.class);
Callcall=service.getResult(etPhone.getText().toString());
我们会获取到要调用的服务的对象PhoneService,然后调用里面的方法getResult,因为我们说到了动态代理必须要实现一个接口,这里的PhoneService 就是一个接口,然后调用create方法具体源码如下:
@SuppressWarnings("unchecked") // Single-interface proxy creation guarded by parameter safety.
public T create(final Class service) {
Utils.validateServiceInterface(service);
if (validateEagerly) {
eagerlyValidateMethods(service);
}
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod =
(ServiceMethod) loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
我们看到这里应用了动态代理,首先service就是接口的class对象。然后最后new InvocationHandler就是实现了代理对象。具体做了什么我们的源码分析有说明这里就不重复说明。
3.retrofit使用过程中使用到的代理设计模式
我们知道,我们在访问网络的时候,会出现当前网络环境较差,当前没有网络,服务器出错等等情况。所以在create返回访问接口之后我们可以再加一个代理来处理这些情况。我们先来看看我们的代理对象:
public class ResponseErrorProxy implements InvocationHandler {
public static final String TAG = ResponseErrorProxy.class.getSimpleName();
private Object mProxyObject;
public ResponseErrorProxy(Object proxyObject) {
mProxyObject = proxyObject;
}
@Override
public Object invoke(Object proxy, final Method method, final Object[] args) {
return Observable.just(null)
.flatMap(new Func1>() {
@Override
public Observable call(Object o) {
try {
return (Observable) method.invoke(mProxyObject, args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
})
.retryWhen(new Func1, Observable>() {
@Override
public Observable call(Observable observable) {
return observable.flatMap(new Func1>() {
@Override
public Observable call(Throwable throwable) {
ResponseError error = null;
if (throwable instanceof ConnectTimeoutException
|| throwable instanceof SocketTimeoutException
|| throwable instanceof UnknownHostException
|| throwable instanceof ConnectException) {
error = new ResponseError(HTTP_NETWORK_ERROR,
StringFetcher.getString(R.string.toast_error_network));
} else if (throwable instanceof HttpException) {
HttpException exception = (HttpException) throwable;
try {
error = GsonHelper.builderGson().fromJson(
exception.response().errorBody().string(), ResponseError.class);
} catch (Exception e) {
if (e instanceof JsonParseException) {
error = new ResponseError(HTTP_SERVER_ERROR,
StringFetcher.getString(R.string.toast_error_server));
} else {
error = new ResponseError(HTTP_UNKNOWN_ERROR,
StringFetcher.getString(R.string.toast_error_unknown));
}
}
} else if (throwable instanceof JsonParseException) {
error = new ResponseError(HTTP_SERVER_ERROR,
StringFetcher.getString(R.string.toast_error_server));
} else {
error = new ResponseError(HTTP_UNKNOWN_ERROR,
StringFetcher.getString(R.string.toast_error_unknown));
}
if (error.getStatus() == HTTP_UNAUTHORIZED) {
return refreshTokenWhenTokenInvalid();
} else {
return Observable.error(error);
}
}
});
}
});
}
private Observable refreshTokenWhenTokenInvalid() {
synchronized (ResponseErrorProxy.class) {
//TODO
return null;
}
}
}
这里用了rxjava的知识,如果看不清楚只要看到动态代理结构就行。然后我们这个在获取接口的时候返回代理对象:
@Provides
@Singleton
ApiService provideApiService(Retrofit retrofit){
return getByProxy(ApiService.class,retrofit);
}
ApiService getByProxy(Class apiService, Retrofit retrofit){
ApiService api = retrofit.create(apiService);
return (ApiService) Proxy.newProxyInstance(apiService.getClassLoader(),new Class[] { apiService },new ResponseErrorProxy(api));
}
我们看到在create返回ApiService 接口对象的时候我们又加了一层的代理,最终provideApiService()方法是返回我们的代理对象。这个方法是不是非常巧妙地处理了这些情况。想要看这段代码的话也可以看github上面:[HospitalGroup项目]。可以看到如果我们一个类实现了一个接口,然后我们又想增加这个类的功能就可以考虑用动态代理。 总结:静态代理还是动态代理,在使用的过程中都有其适用的场景,静态代理在之后的插件化里面用的还是比较多的,以后会见到。动态代理我们这里举了两个例子,这两个都是拦截原有的方法然后来增加额外功能或者解析原来请求方法来做一个动作。这里也希望大家遇到这种情况能想到这个模式。
你可能感兴趣的:(流行框架源码分析(14)-Proxy代理设计模式)
北京大学DeepSeek课程1《DeepSeek与AIGC应用》
daly520
AIGC 人工智能 ai python 深度学习 机器学习
北京大学发布的《DeepSeek与AIGC应用》报告及配套教程,系统介绍了DeepSeek技术特性、AIGC应用场景及实践方法,主要包含以下核心内容:PDF完整版下载北京大学DeepSeek课程《DeepSeek与AIGC应用》下载https://ollama.net.cn/deepseek/14.html一、DeepSeek-R1模型的技术解析1.模型特性与优势DeepSeek-R1是一款专注于
0基础学前端---品优购项目Day14
学代码的小前端
0基础学前端 javascript 前端 html css
0基础学前端—品优购项目Day14视频参考:B站Pink老师本节重点:all项目链接:完整的项目已放到品优购完整项目大家可以自行下载强调内容这里主要强调两个知识点:(1)网站TDK三个标签SEO优化(2)logoSEO优化网站TDK三个标签SEO优化T:title网站名(产品名)网站的介绍D:网站是做什么的K:关键字6~8个最好logoSEO优化(1)logo里面首先放一个h1标签,目的是为了提权
网络空间安全(14)编辑器漏洞
IT 青年
网安知识库 网络空间安全
一、概述网页在线编辑器允许用户在网页上进行文本的编辑,并设置字体样式、段落行间距等,类似于使用Word进行编辑。然而,由于编辑器在处理用户输入、文件上传、权限控制等方面可能存在安全缺陷,因此容易成为攻击者利用的目标。二、常见类型弱口令漏洞描述:弱口令是指容易被猜测或破解的口令。攻击者可能通过暴力破解或字典攻击等方式,尝试登录编辑器的后台管理界面,进而控制整个编辑器。示例:某些编辑器的后台管理界面默
国密算法SSL证书:自主可控的网络安全新选择
ssl证书
国密算法SSL证书:自主可控的网络安全新选择一、什么是国密算法SSL证书?国密算法SSL证书是基于中国自主研发的密码算法(SM2/SM3/SM4)打造的加密证书,遵循国家密码管理局(GM/T0024-2014)标准。与国际通用的RSA、ECC算法不同,国密算法通过国家认证,具备自主知识产权,旨在满足国内网络安全合规要求,保障数据传输安全。二、为何需要国密算法SSL证书?政策合规性金融、政务、能源等
Android 14.0 mt6771新增分区功能实现一
安卓兼职framework应用工程师
android 14.0 Rom定制化系列讲解 android config 新增分区 mt6771
1.前言在14.0的系统ROM定制化开发中,在对某些特殊模块中关于数据的存储方面等需要新增分区来保存,所以就需要在系统分区新增相关的分区,来实现功能,接下来就来实现这个功能,来新增分区功能2.mt6771新增分区功能实现一的核心类build/make/core/Makefilebuild/make/core/board_config.mkbuild/make/core/config.mk3.mt6
tauri tauri-plugin-store .dat 文件存储位置
AG幽默
tauri rust
最近使用tauri2.0.0-alpha.14做一个游戏更新程序,用到了tauri-plugin-store,用于存储本地游戏版本,clear工程后版本依旧存在,.dat文件并未清空,翻阅了下资料,记录一下文件位置:C:\Users{计算机用户名}\AppData\Local\{tauri.conf.json.identifier}
python系列&deep_study系列:爆炸!Deepseek全模型支持联网搜索+文档上传
坦笑&&life
AI系列 机器学习 深度学习 自然语言处理
爆炸!Deepseek全模型支持联网搜索+文档上传可以直接使用DeepSeekR1满血+联网版(app下载链接):https://app.1foo.com/install/74966A可以直接使用DeepSeekR1满血+联网版(参考链接):https://blog.csdn.net/weixin_54626591/article/details/145640080https://blog.csd
Win11安装VMware和Ubuntu并使用ssh访问部署模型
music&movie
工具 os ubuntu ssh linux
VMware:https://zhuanlan.zhihu.com/p/14645133730CDSRepository-/var/www/public/stage/session-02/cds/vmw-desktop/wsUbuntu:Ubuntu22.04.5LTS(JammyJellyfish)ssh&sftp:DownloadPuTTY:latestrelease(0.83)ssh&sft
图像识别技术与应用课后总结(14)
一元钱面包
人工智能
训练模型加载预处理数据集:可以借助PyTorch的数据处理工具,如torch.utils和torchvision等定义损失函数:既可以自定义,也能使用PyTorch内置的,像回归任务常用nn.MSELoss(),分类任务常用nn.BCELoss()定义优化方法:PyTorch的优化方法封装在torch.optim中,基于基类optim.Optimizer,能实现自定义优化步骤。常用的优化算法如梯度
百万架构师第二十二课:源码分析:Spring 源码分析:Spring经典面试答疑|JavaGuide
大雄野比
spring 面试 java
Spring面试解答上半节:面试中需要注意的细节动脑子,面试是一种交流面试的时候,要用心去感受当时面试场景了解自己,自己的长处、自己的短处(巧妙地扬长避短)了解1.公司的业务场景2.你是去面试什么岗位的?Java高级工程师实际工作经验是1年(如实填写)1、请描述SpringIOC的工作原理答:定位加载注册BeanFactoryBeanDefintion...1-3年1+ApplicationCon
React Native 源码分析(一)——启动流程
薛瑄
ReactNative react native 源码分析
本系列文章,是分析Android的ReactNative的源码,主要包括以下文章,和以往的源码系列一样,分析主流程的代码,不会细致到每一行(但相比上一篇的Gradle源码分析,要细致很多),会涉及到java、C++、js等源码。前三篇RN版本是0.64.0,后面是0.72.01、ReactNative源码分析(一)——启动流程2、ReactNative源码分析(二)——NativeModules桥
影院购票系统(二)——uni-app移动应用开发
阿常11
uni-app移动应用开发 uni-app javascript 开发语言
这一篇讲解系统的逻辑代码部分,下面是ai的讲解,也可以直接跳到代码部分进行浏览。一、整体功能概述这个Vue组件构建了一个完整的影院座位选择系统,涵盖从座位数据初始化、视图渲染到交互处理以及业务逻辑的整个流程。它遵循响应式编程模式,数据的变化能够及时反映在视图上,反之亦然。二、核心数据结构剖析seatData二维数组组件利用Vue的响应式数据模型,定义了seatData这个二维数组,用来表示9x14
园区环境数字化管理系统(源码+文档+讲解+演示)
开源项目介绍
引言随着工业化和城市化的快速发展,园区环境管理面临着越来越多的挑战。园区环境数字化管理系统通过数字化手段,为园区管理者提供了一个高效、透明、智能的管理平台。本文将详细介绍园区环境数字化管理系统的功能、技术架构以及其在提升园区环境管理效率中的优势。系统概述园区环境数字化管理系统采用前后端分离的架构设计,服务端基于MySQL5.7+、JDK1.8+和Redis,前端则采用Vue2.6.14和Eleme
软件架构设计与模式之:模块化设计与组件化架构
AI天才研究院
AI大模型企业级应用开发实战 大数据 人工智能 语言模型 Java Python 架构设计
作者:禅与计算机程序设计艺术1.背景介绍模块化、组件化、微服务架构已经成为云计算的主流架构模式,软件架构设计如何满足需求并持续优化性能是一个非常重要的课题。本文将阐述模块化、组件化、微服务架构的概念及优缺点,并从面向对象的角度阐述模块化设计与组件化架构的过程。同时介绍一些基于Java语言的开源框架(如Spring)所实现的模块化、组件化、微服务架构,并深入到源码分析其实现机制和原理。本文的主要读者
分布式锁—4.Redisson的联锁和红锁一
东阳马生架构
分布式锁原理与源码 分布式锁 Redission
大纲1.Redisson联锁MultiLock概述2.Redisson联锁MultiLock的加锁与释放锁3.Redisson红锁RedLock的算法原理4.Redisson红锁RedLock的源码分析1.Redisson联锁MultiLock概述(1)MultiLock的简介(2)MultiLock的使用(3)MultiLock的初始化(1)MultiLock的简介一.一次性要锁定多个资源的场景
【价值洼地的狩猎机制】
调皮的芋头
机器学习
大资本构建价值掠夺网络的本质,是一场精密设计的系统性剥削工程。其运作逻辑远超普通市场行为,而是通过技术霸权、制度漏洞与认知操控三位一体的组合拳,实现对目标领域的深度殖民化控制:一、价值洼地的狩猎机制1.量子级数据建模摩根士丹利开发的"经济熵变监测系统",实时抓取全球2.3亿个数据节点(包括电力消耗、集装箱空置率、社交媒体情绪指数等),通过深度学习预测区域经济断裂点。例如2014年预判委内瑞拉石油危
阿里巴巴宣布:全面开源旗下视频生成模型万相2.1
大公产经晚间消息
娱乐 社交电子 媒体
2月25日晚,阿里云宣布全面开源旗下视频生成模型万相2.1模型。据介绍,此次开源基于Apache2.0协议,14B和1.3B两个参数规格的全部推理代码和权重全部开源,同时支持文生视频和图生视频任务,全球开发者可在Github、HuggingFace和魔搭社区下载体验。阿里云在解读万相2.1模型技术时提到,万相能够稳定展现各种复杂的人物肢体运动,如旋转、跳跃、转身、翻滚等;能够精准还原碰撞、反弹、切
【2025小白版】计算复试/保研机试模板(个人总结非GPT生成)附代码
数维学长986
计算机复试 复试 计算机 计算机机试 机试 复试机试
一、编程语言选择很多高校在机试中对编程语言都有明确规定,像复旦大学计算机学院就说明可选择C、C++或Java语言答题,还支持C11(gcc5.4),C++14(g++5.4),Java(openjdk1.8)等编译环境。这里强烈建议大家使用C/C++,因为几乎所有高校都支持,通用性超强。二、准备好模板是至关重要的一般来说,机试都可以带书和纸质资料进入考场。所以提前把那些函数的用法和算法的模板准备好
14、TCP连接如何确保可靠性【高频】
桃酥403
桃酥的学习笔记(网络篇) tcp/ip php 网络
TCP通过三次握手、确认应答、校验和、超时重传、流量控制、拥塞控制等机制,可以保证传输的数据按序到达,不会丢失和重复。1.三次握手与连接管理:TCP在建立连接时采用三次握手,确保通信双方都能接受和发送数据。同时,TCP还使用四次挥手来正常终止连接,确保最后的数据能够完整传输。2.序列号和确认应答:TCP为发送的每个字节都配一个序列号,接收方通过发送确认号(ACK)来确认接收到的数据。确认
静态时序分析:报告命令report_timing详解
日晨难再
静态时序分析 # 静态时序分析基础 数字IC 硬件工程
相关阅读静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm=1001.2014.3001.5482目录指定时序路径起点指定时序路径经过点指定时序路径终点指定不报告的路径指定路径类型指定延迟类型指定每个终点报告的最大时序路径数指定每个时序组的最大时序路径数指定在时序路径中显示输入引脚指定显示线网指定显示转换时间
基于 .NET 6 使用 YARP (Yet Another Reverse Proxy) 进行负载均衡
.NET跨平台
ASP.NET Core Web API .net 负载均衡
下面是基于.NET6使用YARP(YetAnotherReverseProxy)进行负载均衡,实现ASP.NETCoreAPI的水平扩展的示例,包括详细的配置步骤和代码示例。1.创建ASP.NETCoreAPI服务首先,我们需要创建多个实例的ASP.NETCoreAPI服务,它们将由YARP代理进行负载均衡。1.1创建ASP.NETCoreAPI使用以下命令创建一个新的WebAPI项目:dotne
深度解析RocketMQ核心机制:CommitLog存储与DLedger选举算法
千里码!
rocketmq 后端技术 java rocketmq 算法 数据库
深度解析RocketMQ核心机制:CommitLog存储与DLedger选举算法编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039一、Com
MATH2110 - STATISTICS 3
后端
MATH2110-STATISTICS3SPRINGSEMESTERSEMESTER2025Coursework1Deadline:3pm,Friday14/3/2025Yourneat,clearly-legiblesolutionsshouldbesubmittedelectronicallyasaJupyterorPDFfileviatheMATH2110Moodlepagebythedea
深入解析Java线程模型:从BIO到NIO的性能跃迁之路
千里码!
后端技术 java IO java java nio 开发语言
深入解析Java线程模型:从BIO到NIO的性能跃迁之路编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039引言在高并发网络编程中,线程模型的
Python模块之pywin32
宅羽
Python模块
◆问题汇总:1、多线程使用pywin32com造成的问题:pywintypes.com_error:(-2147221008,'尚未调用CoInitialize。',None,None)解决方法:在线程启动时先运行pythoncom.CoInitialize()importpythoncomclassSecretFile(object):def_save_tmpfile(self,passwd):
X-LoRA:高效微调 LoRA 系列,实现不同领域知识专家混合模型
yumuing blog
前沿论文解读 llama 人工智能 语言模型
文献卡X-LoRA:MixtureofLow-RankAdapterExperts,aFlexibleFrameworkforLargeLanguageModelswithApplicationsinProteinMechanicsandMolecularDesign作者:EricL.Buehler;MarkusJ.BuehlerDOI:10.48550/arXiv.2402.07148摘要:We
十个程序员必备的精选网站
航叔啦
python vue vue.js
程序员的工作和日常生活非常的枯燥,这里给大家推荐一些程序员经常使用的网站,也是我经常上的一些网站,尤其是前三个网站感觉用起来非常的舒服。我大致把这些网站分为三类,使用工具类,设计分享类,资讯交流类,业界良心类。希望能对大家有所帮助。1,Github代码托管(https://github.com/)作为开源代码库以及版本控制系统,Github拥有140多万开发者用户。随着越来越多的应用程序转移到了云
5个GitHub热点开源项目!!
架构文摘JGWZ
github 学习 工具
1.自托管Moonlight游戏串流服务:Sunshine主语言:C++,Star:14.4k,周增长:500这是一个自托管的Moonlight游戏串流服务器端项目,支持所有Moonlight客户端。用户可以在自己电脑上搭建一个游戏流服务,通过局域网或互联网串流PC游戏到其他设备,实现跨设备的游戏共享和远程操控。它还提供了Web管理界面,方便进行配置和客户端配对,适用于Windows、Linux和
最新版阿里 231.13,x82y 滑块、水果滑块验证码,ali140~ali 231 都有,ai 轨迹通杀!
呆头呆脑~
python 爬虫 javascript 网络爬虫 算法 ai
声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!#欢迎交流wjxch1004
Vue3+Vite+Axios Request 请求封装(TS版本)最新
她似晚风般温柔789
技术分享 项目分享 typescript vue 前端
Vue3+Vite+AxiosRequest请求封装(TS版本)http>index.ts请求封装/**@Date:2024-03-3012:37:05*@LastEditors:zhong*@LastEditTime:2024-03-3014:12:52*@FilePath:\app-admin\src\http\index.ts*/importaxios,{AxiosInstance,Axio
Hadoop(一)
朱辉辉33
hadoop linux
今天在诺基亚第一天开始培训大数据,因为之前没接触过Linux,所以这次一起学了,任务量还是蛮大的。
首先下载安装了Xshell软件,然后公司给了账号密码连接上了河南郑州那边的服务器,接下来开始按照给的资料学习,全英文的,头也不讲解,说锻炼我们的学习能力,然后就开始跌跌撞撞的自学。这里写部分已经运行成功的代码吧.
在hdfs下,运行hadoop fs -mkdir /u
maven An error occurred while filtering resources
blackproof
maven 报错
转:http://stackoverflow.com/questions/18145774/eclipse-an-error-occurred-while-filtering-resources
maven报错:
maven An error occurred while filtering resources
Maven -> Update Proje
jdk常用故障排查命令
daysinsun
jvm
linux下常见定位命令:
1、jps 输出Java进程
-q 只输出进程ID的名称,省略主类的名称;
-m 输出进程启动时传递给main函数的参数;
&nb
java 位移运算与乘法运算
周凡杨
java 位移 运算 乘法
对于 JAVA 编程中,适当的采用位移运算,会减少代码的运行时间,提高项目的运行效率。这个可以从一道面试题说起:
问题:
用最有效率的方法算出2 乘以8 等於几?”
答案:2 << 3
由此就引发了我的思考,为什么位移运算会比乘法运算更快呢?其实简单的想想,计算机的内存是用由 0 和 1 组成的二
java中的枚举(enmu)
g21121
java
从jdk1.5开始,java增加了enum(枚举)这个类型,但是大家在平时运用中还是比较少用到枚举的,而且很多人和我一样对枚举一知半解,下面就跟大家一起学习下enmu枚举。先看一个最简单的枚举类型,一个返回类型的枚举:
public enum ResultType {
/**
* 成功
*/
SUCCESS,
/**
* 失败
*/
FAIL,
MQ初级学习
510888780
activemq
1.下载ActiveMQ
去官方网站下载:http://activemq.apache.org/
2.运行ActiveMQ
解压缩apache-activemq-5.9.0-bin.zip到C盘,然后双击apache-activemq-5.9.0-\bin\activemq-admin.bat运行ActiveMQ程序。
启动ActiveMQ以后,登陆:http://localhos
Spring_Transactional_Propagation
布衣凌宇
spring transactional
//事务传播属性
@Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个
@Transactional(propagation=Propagation.NOT_SUPPORTED)//这个方法不开启事务
@Transactional(propagation=Propagation.REQUIREDS_N
我的spring学习笔记12-idref与ref的区别
aijuans
spring
idref用来将容器内其他bean的id传给<constructor-arg>/<property>元素,同时提供错误验证功能。例如:
<bean id ="theTargetBean" class="..." />
<bean id ="theClientBean" class=&quo
Jqplot之折线图
antlove
js jquery Web timeseries jqplot
timeseriesChart.html
<script type="text/javascript" src="jslib/jquery.min.js"></script>
<script type="text/javascript" src="jslib/excanvas.min.js&
JDBC中事务处理应用
百合不是茶
java JDBC编程 事务控制语句
解释事务的概念; 事务控制是sql语句中的核心之一;事务控制的作用就是保证数据的正常执行与异常之后可以恢复
事务常用命令:
Commit提交
[转]ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
bijian1013
java 多线程 线程安全 HashMap
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1.0的一部分。 Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同步的
ng-if与ng-show、ng-hide指令的区别和注意事项
bijian1013
JavaScript AngularJS
angularJS中的ng-show、ng-hide、ng-if指令都可以用来控制dom元素的显示或隐藏。ng-show和ng-hide根据所给表达式的值来显示或隐藏HTML元素。当赋值给ng-show指令的值为false时元素会被隐藏,值为true时元素会显示。ng-hide功能类似,使用方式相反。元素的显示或
【持久化框架MyBatis3七】MyBatis3定义typeHandler
bit1129
TypeHandler
什么是typeHandler?
typeHandler用于将某个类型的数据映射到表的某一列上,以完成MyBatis列跟某个属性的映射
内置typeHandler
MyBatis内置了很多typeHandler,这写typeHandler通过org.apache.ibatis.type.TypeHandlerRegistry进行注册,比如对于日期型数据的typeHandler,
上传下载文件rz,sz命令
bitcarter
linux命令rz
刚开始使用rz上传和sz下载命令:
因为我们是通过secureCRT终端工具进行使用的所以会有上传下载这样的需求:
我遇到的问题:
sz下载A文件10M左右,没有问题
但是将这个文件A再传到另一天服务器上时就出现传不上去,甚至出现乱码,死掉现象,具体问题
解决方法:
上传命令改为;rz -ybe
下载命令改为:sz -be filename
如果还是有问题:
那就是文
通过ngx-lua来统计nginx上的虚拟主机性能数据
ronin47
ngx-lua 统计 解禁ip
介绍
以前我们为nginx做统计,都是通过对日志的分析来完成.比较麻烦,现在基于ngx_lua插件,开发了实时统计站点状态的脚本,解放生产力.项目主页: https://github.com/skyeydemon/ngx-lua-stats 功能
支持分不同虚拟主机统计, 同一个虚拟主机下可以分不同的location统计.
可以统计与query-times request-time
java-68-把数组排成最小的数。一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的。例如输入数组{32, 321},则输出32132
bylijinnan
java
import java.util.Arrays;
import java.util.Comparator;
public class MinNumFromIntArray {
/**
* Q68输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
* 例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题
Oracle基本操作
ccii
Oracle SQL总结 Oracle SQL语法 Oracle基本操作 Oracle SQL
一、表操作
1. 常用数据类型
NUMBER(p,s):可变长度的数字。p表示整数加小数的最大位数,s为最大小数位数。支持最大精度为38位
NVARCHAR2(size):变长字符串,最大长度为4000字节(以字符数为单位)
VARCHAR2(size):变长字符串,最大长度为4000字节(以字节数为单位)
CHAR(size):定长字符串,最大长度为2000字节,最小为1字节,默认
[强人工智能]实现强人工智能的路线图
comsci
人工智能
1:创建一个用于记录拓扑网络连接的矩阵数据表
2:自动构造或者人工复制一个包含10万个连接(1000*1000)的流程图
3:将这个流程图导入到矩阵数据表中
4:在矩阵的每个有意义的节点中嵌入一段简单的
给Tomcat,Apache配置gzip压缩(HTTP压缩)功能
cwqcwqmax9
apache
背景:
HTTP 压缩可以大大提高浏览网站的速度,它的原理是,在客户端请求网页后,从服务器端将网页文件压缩,再下载到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的浏览过程HTML ,CSS,Javascript , Text ,它可以节省40%左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩,
SpringMVC and Struts2
dashuaifu
struts2 springMVC
SpringMVC VS Struts2
1:
spring3开发效率高于struts
2:
spring3 mvc可以认为已经100%零配置
3:
struts2是类级别的拦截, 一个类对应一个request上下文,
springmvc是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应
所以说从架构本身上 spring3 mvc就容易实现r
windows常用命令行命令
dcj3sjt126com
windows cmd command
在windows系统中,点击开始-运行,可以直接输入命令行,快速打开一些原本需要多次点击图标才能打开的界面,如常用的输入cmd打开dos命令行,输入taskmgr打开任务管理器。此处列出了网上搜集到的一些常用命令。winver 检查windows版本 wmimgmt.msc 打开windows管理体系结构(wmi) wupdmgr windows更新程序 wscrip
再看知名应用背后的第三方开源项目
dcj3sjt126com
ios
知名应用程序的设计和技术一直都是开发者需要学习的,同样这些应用所使用的开源框架也是不可忽视的一部分。此前《
iOS第三方开源库的吐槽和备忘》中作者ibireme列举了国内多款知名应用所使用的开源框架,并对其中一些框架进行了分析,同样国外开发者
@iOSCowboy也在博客中给我们列出了国外多款知名应用使用的开源框架。另外txx's blog中详细介绍了
Facebook Paper使用的第三
Objective-c单例模式的正确写法
jsntghf
单例 ios iPhone
一般情况下,可能我们写的单例模式是这样的:
#import <Foundation/Foundation.h>
@interface Downloader : NSObject
+ (instancetype)sharedDownloader;
@end
#import "Downloader.h"
@implementation
jquery easyui datagrid 加载成功,选中某一行
hae
jquery easyui datagrid 数据加载
1.首先你需要设置datagrid的onLoadSuccess
$(
'#dg'
).datagrid({onLoadSuccess :
function
(data){
$(
'#dg'
).datagrid(
'selectRow'
,3);
}});
2.onL
jQuery用户数字打分评价效果
ini
JavaScript html jquery Web css
效果体验:http://hovertree.com/texiao/jquery/5.htmHTML文件代码:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>jQuery用户数字打分评分代码 - HoverTree</
mybatis的paramType
kerryg
DAO sql
MyBatis传多个参数:
1、采用#{0},#{1}获得参数:
Dao层函数方法:
public User selectUser(String name,String area);
对应的Mapper.xml
<select id="selectUser" result
centos 7安装mysql5.5
MrLee23
centos
首先centos7 已经不支持mysql,因为收费了你懂得,所以内部集成了mariadb,而安装mysql的话会和mariadb的文件冲突,所以需要先卸载掉mariadb,以下为卸载mariadb,安装mysql的步骤。
#列出所有被安装的rpm package rpm -qa | grep mariadb
#卸载
rpm -e mariadb-libs-5.
利用thrift来实现消息群发
qifeifei
thrift
Thrift项目一般用来做内部项目接偶用的,还有能跨不同语言的功能,非常方便,一般前端系统和后台server线上都是3个节点,然后前端通过获取client来访问后台server,那么如果是多太server,就是有一个负载均衡的方法,然后最后访问其中一个节点。那么换个思路,能不能发送给所有节点的server呢,如果能就
实现一个sizeof获取Java对象大小
teasp
java HotSpot 内存 对象大小 sizeof
由于Java的设计者不想让程序员管理和了解内存的使用,我们想要知道一个对象在内存中的大小变得比较困难了。本文提供了可以获取对象的大小的方法,但是由于各个虚拟机在内存使用上可能存在不同,因此该方法不能在各虚拟机上都适用,而是仅在hotspot 32位虚拟机上,或者其它内存管理方式与hotspot 32位虚拟机相同的虚拟机上 适用。
SVN错误及处理
xiangqian0505
SVN提交文件时服务器强行关闭
在SVN服务控制台打开资源库“SVN无法读取current” ---摘自网络 写道 SVN无法读取current修复方法 Can't read file : End of file found
文件:repository/db/txn_current、repository/db/current
其中current记录当前最新版本号,txn_current记录版本库中版本