okhttputils【 Android 一个改善的okHttp封装库】使用(三)
版权声明:本文为HaiyuKing原创文章,转载请注明出处!
前言
这一篇主要讲一下将OkHttpUtils运用到mvp模式中。
数据请求地址:http://www.wanandroid.com/tools/mockapi/418/version
效果图
代码分析
1、集成OKHttpUtils开源库参考《okhttputils【 Android 一个改善的okHttp封装库】使用(一)》;
2、使用mvp模式封装网络请求。
使用步骤
一、项目组织结构图
注意事项:
1、 导入类文件后需要change包名以及重新import R文件路径
2、 Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖
二、导入步骤
集成OKHttpUtils
参考《okhttputils【 Android 一个改善的okHttp封装库】使用(一)》
mvp模式下修改和新增的类文件
LoginLogic.java【调用的方法需要传入tag值,且注意方法命名规则:xxxApi】
package com.why.project.okhttputilsmvpdemo.logic; import com.why.project.okhttputilsmvpdemo.MyApplication;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback; /**
* Created by HaiyuKing
* Used
*/ public class LoginLogic extends BaseLogic { private static LoginLogic _Instance = null; public static LoginLogic Instance() {
if (_Instance == null)
_Instance = new LoginLogic();
return _Instance;
}
private LoginLogic() {
this.context = MyApplication.getAppContext();//防止了内存泄漏
} /**
* 发现新版本接口
*/
public String updateVersionApi(String tag, StringCallback callback)
throws Exception {
String result = "";
OkHttpUtils
.get()
.url(getSpcyUrl(ServerApi.UPDATE_VERSION_URL))
.id(100)
.tag(tag)
.build()
.execute(callback);
return result;
}
}
UpdateVersionBean.java【一般项目中都是需要用到的】
package com.why.project.okhttputilsmvpdemo.bean; /**
* Created by HaiyuKing
* Used 更新APP的实体类
*/ public class UpdateVersionBean { private String versionName;//服务器上的版本号,比如3.0
private String forceUpdate;//是否强制更新
private String title;//标题,如果为空,则默认显示发现新版本
private String content;//更新内容,如果为空,则不显示
private String downloadurl;//下载地址
private String fileSize;//文件大小 public String getVersionName() {
return versionName;
} public void setVersionName(String versionName) {
this.versionName = versionName;
} public String getForceUpdate() {
return forceUpdate;
} public void setForceUpdate(String forceUpdate) {
this.forceUpdate = forceUpdate;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public String getDownloadurl() {
return downloadurl;
} public void setDownloadurl(String downloadurl) {
this.downloadurl = downloadurl;
} public String getFileSize() {
return fileSize;
} public void setFileSize(String fileSize) {
this.fileSize = fileSize;
}
}
UpdateVersionModel.java【命名规则:bean类的前缀+Model】【用于封装网络请求,然后通过callback回调】
package com.why.project.okhttputilsmvpdemo.model; import android.content.Context; import com.why.project.okhttputilsmvpdemo.MyApplication;
import com.why.project.okhttputilsmvpdemo.R;
import com.why.project.okhttputilsmvpdemo.bean.UpdateVersionBean;
import com.why.project.okhttputilsmvpdemo.logic.LoginLogic;
import com.zhy.http.okhttp.callback.StringCallback; import org.json.JSONException;
import org.json.JSONObject; import okhttp3.Call;
import okhttp3.Request; /**
* Created by HaiyuKing
* Used 发现新版本的请求类
*/ public class UpdateVersionModel { /**获取新版本的信息*/
public void updateVersionInfo(String tag,
final LoadingDataCallBack<UpdateVersionBean> callBack) {
final Context mContext = MyApplication.getAppContext();
//执行请求任务
try {
LoginLogic.Instance().updateVersionApi(tag,new StringCallback() {
@Override
public void onBefore(Request request, int id)
{
callBack.onBefore("");//回调
}
@Override
public void onAfter(int id)
{
callBack.onAfter();//回调
}
@Override
public void onError(Call call, Exception e, int id)
{
callBack.onError("");//回调
}
@Override
public void onResponse(String response, int id)
{
switch (id)
{
case 100://http
try {
if (response != null && !"".equals(response)){
JSONObject versionInfoObj = new JSONObject(response); UpdateVersionBean updateVersionBean = new UpdateVersionBean();
updateVersionBean.setVersionName(versionInfoObj.getString("versionName"));
updateVersionBean.setForceUpdate(versionInfoObj.getString("forceUpdate"));
updateVersionBean.setTitle(versionInfoObj.getString("title"));
updateVersionBean.setContent(versionInfoObj.getString("content"));
updateVersionBean.setDownloadurl(versionInfoObj.getString("downloadurl"));
updateVersionBean.setFileSize(versionInfoObj.getString("fileSize")); callBack.onSuccess(updateVersionBean);
}else {
//提示失败
callBack.onFailure("");//回调
}
}catch (JSONException e) {
callBack.onError(mContext.getResources().getString(R.string.login_json_exception));//回调
}catch (Exception e) {
callBack.onError(mContext.getResources().getString(R.string.login_json_exception));//回调
}
break;
case 101://https
break;
}
}
@Override
public void inProgress(float progress, long total, int id)
{
//callBack.onProgress(progress,total,id);//回调
}
});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
LoadingDataCallBack.java【网路请求的回调】
package com.why.project.okhttputilsmvpdemo.model; /**
* Used 常规接口请求的回调【请求发现新版本接口】
*/ public interface LoadingDataCallBack<T> { /**
* 数据请求前的操作
* @ TODO 一般用于显示加载对话框
*/
void onBefore(String msg); /**
* 当请求数据结束时,无论请求结果是成功,失败或是抛出异常都会执行此方法给用户做处理
* @ TODO 请求结束,一般隐藏加载提示对话框,或者执行下一步操作
*/
void onAfter(); /**
* 数据请求成功
* @param response 请求到的数据
* @ TODO 请求成功,一般执行下一步的操作(继续请求接口,或者显示)
*/
void onSuccess(T response); /**
* 数据请求成功的提示语
* @param msg 提示语
* @ TODO 请求成功,一般用来提示msg
*/
void onSuccessToast(String msg); /**
* 请求失败
* 使用网络API接口请求方式时,虽然已经请求成功但是由于{@code msg}的原因无法正常返回数据。
* @ TODO 请求失败,一般用来提示msg状态值以及提示语,或者显示无数据的区域【所以需要跟onError方法区别开来】
*/
void onFailure(String msg); /**
* 请求数据错误,指在请求网络API接口请求方式时,出现无法联网、缺少权限,内存泄露等原因导致无法连接到请求数据源。
* @ TODO 请求错误,一般隐藏加载提示对话框,提示服务器返回的失败信息等
*/
void onError(String msg); /**
* 无网络时返回
* @ TODO 一般隐藏加载提示对话框,提示当前网络不可用,或者显示无网络的区域【所以需要跟onError方法区别开来】
*/
void onNoNetWork(String msg);
}
IBaseView.java【提取出来通用的抽象方法】
package com.why.project.okhttputilsmvpdemo.iview; /**
* Created by HaiyuKing
* Used IView基类接口(含有通用的抽象方法声明)
*/ public interface IBaseView {
/** 显示正在加载进度框【通用】*/
void showLoading(String msg); /** 隐藏正在加载进度框【通用】*/
void hideLoading(); /**显示提示信息【通用】*/
void showToast(String msg); /** 获取OkHttpUtil用到的tag,一般使用当前类的类名即可。比如:this.getClass().getSimpleName()【通用】*/
String getOkHttpUtilTag(); /** 处理失败的情况【应该每一个接口对应一个,不过此处省略了】【主要用于第一次请求的时候,显示提示区域,一般情况下可以直接showToast即可】*/
void showFail(String msg); /**
* 处理无网络的情况【应该每一个接口对应一个,不过此处省略了】【主要用于第一次请求的时候,显示提示区域,一般情况下可以直接showToast即可】*/
void showNotNetWork(String msg);
}
IUpdateAppView.java【如果跟某个activity或者fragment耦合度很高,那么可以命名为MainActivityView.java(也就是以这个activity或者fragment命名)】【命名规则:I{xxx}View】
package com.why.project.okhttputilsmvpdemo.iview; import com.why.project.okhttputilsmvpdemo.bean.UpdateVersionBean; /**
* Created by HaiyuKing
* Used 更新APP的view
*/ public interface IUpdateAppView extends IBaseView{ /** 打开发现新版本对话框*/
void showUpdateDialog(UpdateVersionBean updateVersionBean); }
UpdateAppPresenter.java【如果跟某个activity或者fragment耦合度很高,那么可以命名为MainActivityPresenter.java(也就是以这个activity或者fragment命名)】【命名规则:xxxxPresenter】
package com.why.project.okhttputilsmvpdemo.presenter; import android.text.TextUtils; import com.why.project.okhttputilsmvpdemo.bean.UpdateVersionBean;
import com.why.project.okhttputilsmvpdemo.iview.IUpdateAppView;
import com.why.project.okhttputilsmvpdemo.model.LoadingDataCallBack;
import com.why.project.okhttputilsmvpdemo.model.UpdateVersionModel; /**
* Created by HaiyuKing
* Used 更新APP的presenter
*/ public class UpdateAppPresenter {
private IUpdateAppView mvpView;//view接口类
private UpdateVersionModel mUpdateVersionModel;//发现新版本接口请求的model类 public UpdateAppPresenter(){
mUpdateVersionModel = new UpdateVersionModel();
} /**
* 绑定view,一般在初始化中调用该方法
*/
public void attachView(IUpdateAppView view){
mvpView = view;
} /**
* 断开view,一般在onDestroy中调用
*/
public void detachView() {
mvpView = null;
} /**
* 是否与View建立连接
* 每次调用业务请求的时候都要出先调用方法检查是否与View建立连接
*/
public boolean isViewAttached(){
return mvpView != null;
} /**发现新版本接口数据*/
public void updateVersion() {
if (!TextUtils.isEmpty(mvpView.getOkHttpUtilTag())) {
mUpdateVersionModel.updateVersionInfo(mvpView.getOkHttpUtilTag(),
new LoadingDataCallBack<UpdateVersionBean>() {
@Override
public void onBefore(String msg) {
if (isViewAttached()) {
mvpView.showLoading(msg);
}
} @Override
public void onAfter() {
if (isViewAttached()) {
mvpView.hideLoading();
}
} @Override
public void onSuccess(UpdateVersionBean response) {
if (isViewAttached()) {
mvpView.showUpdateDialog(response);
}
} @Override
public void onSuccessToast(String msg) {
if (isViewAttached()) {
mvpView.showToast(msg);
}
} @Override
public void onFailure(String msg) {
if (isViewAttached()) {
mvpView.showFail(msg);
}
} @Override
public void onError(String msg) {
if (isViewAttached()) {
mvpView.showToast(msg);
}
} @Override
public void onNoNetWork(String msg) { }
});
}
}
}
三、使用方法
Activity下的使用
package com.why.project.okhttputilsmvpdemo; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView; import com.why.project.okhttputilsmvpdemo.bean.UpdateVersionBean;
import com.why.project.okhttputilsmvpdemo.iview.IUpdateAppView;
import com.why.project.okhttputilsmvpdemo.presenter.UpdateAppPresenter;
import com.why.project.okhttputilsmvpdemo.utils.ToastUtil;
import com.why.project.okhttputilsmvpdemo.utils.httputil.HttpUtil;
import com.zhy.http.okhttp.OkHttpUtils; public class MainActivity extends AppCompatActivity implements IUpdateAppView{ private static final String TAG = MainActivity.class.getSimpleName(); private UpdateAppPresenter mvpUpdateAppPresenter;//发现新版本
private String okHttpTag = "";//网络请求用到的tag private Button btn_get;
private TextView tv_show; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //presenter绑定view{1}
if(mvpUpdateAppPresenter == null){
mvpUpdateAppPresenter = new UpdateAppPresenter();
}
//presenter绑定view{2}
if(mvpUpdateAppPresenter != null) {
mvpUpdateAppPresenter.attachView(this);
} initViews();
initData();
initEvents();
} @Override
public void onPause() {
// TODO Auto-generated method stub
super.onPause();
//取消网络请求,根据tag取消请求
OkHttpUtils.getInstance().cancelTag(okHttpTag);
} protected void onDestroy() {
//取消网络请求
Log.w(TAG,"this.getClass().getSimpleName()="+this.getClass().getSimpleName());
OkHttpUtils.getInstance().cancelTag(okHttpTag);
super.onDestroy(); //presenter解绑view{3}
if(mvpUpdateAppPresenter != null){
mvpUpdateAppPresenter.detachView();
}
} private void initViews() {
btn_get = (Button) findViewById(R.id.btn_get);
tv_show = (TextView) findViewById(R.id.tv_show);
} /**初始化数据*/
private void initData() {
okHttpTag = this.getClass().getSimpleName();
} private void initEvents() {
btn_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (HttpUtil.isNetworkAvailable(MainActivity.this)) {
//执行网络请求接口
try {
mvpUpdateAppPresenter.updateVersion();//请求发现新版本接口
} catch (Exception e) {
e.printStackTrace();
}
}else{
ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.network_enable));
}
}
});
} @Override
public void showLoading(String msg) {
//showProgressDialog("");//显示进度加载框
} @Override
public void hideLoading() {
//dismissProgressDialog();//隐藏进度加载框
} @Override
public void showToast(String msg) {
ToastUtil.showShortToast(msg);
} @Override
public String getOkHttpUtilTag() {
return okHttpTag;
} @Override
public void showFail(String msg) {
ToastUtil.showShortToast(msg);
} @Override
public void showNotNetWork(String msg) {
ToastUtil.showShortToast(msg);
} @Override
public void showUpdateDialog(UpdateVersionBean updateVersionBean) {
String showText = "新版本号:" + updateVersionBean.getVersionName() +
"\n是否强制更新:" + updateVersionBean.getForceUpdate() +
"\n标题:" + updateVersionBean.getTitle() +
"\n内容:" + updateVersionBean.getContent().replace("\\n", "\n") +
"\n文件大小:" + updateVersionBean.getFileSize() +
"\n下载地址:" + updateVersionBean.getDownloadurl();
tv_show.setText(showText);
}
}
Fragment下的使用
package com.why.project.okhttputilsmvpdemo; import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView; import com.why.project.okhttputilsmvpdemo.bean.UpdateVersionBean;
import com.why.project.okhttputilsmvpdemo.iview.IUpdateAppView;
import com.why.project.okhttputilsmvpdemo.presenter.UpdateAppPresenter;
import com.why.project.okhttputilsmvpdemo.utils.ToastUtil;
import com.why.project.okhttputilsmvpdemo.utils.httputil.HttpUtil;
import com.zhy.http.okhttp.OkHttpUtils; /**
* Created by HaiyuKing
* Used
*/ public class MainFragment extends Fragment implements IUpdateAppView{
private static final String TAG = MainFragment.class.getSimpleName(); private UpdateAppPresenter mvpUpdateAppPresenter;//发现新版本
private String okHttpTag = "";//网络请求用到的tag /**View实例*/
private View myView;
private Context mContext; private Button btn_get;
private TextView tv_show; @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//presenter绑定view{1}
if(mvpUpdateAppPresenter == null){
mvpUpdateAppPresenter = new UpdateAppPresenter();
}
} //重写
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//presenter绑定view【适用presenter调用代码在onCreateView方法中执行的情况】{2}
/*if(mvpPresenter != null) {
mvpPresenter.attachView(this);
}*/
myView = inflater.inflate(R.layout.activity_main, container, false);
return myView;
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
//由于fragment生命周期比较复杂,所以Presenter在onCreateView创建视图之后再进行绑定,不然会报空指针异常
//presenter绑定view【如果presenter调用的代码是在onCreateView中执行的话,那么此处不合适执行绑定的方法】{2"}
if(mvpUpdateAppPresenter != null) {
mvpUpdateAppPresenter.attachView(this);
} mContext = getActivity(); //初始化控件以及设置
initViews();
//初始化数据
initData();
initEvents();
} @Override
public void onResume() {
super.onResume();
} @Override
public void onPause() {
super.onPause();
} @Override
public void onDestroyView() {
//presenter解绑view{3}
if(mvpUpdateAppPresenter != null){
mvpUpdateAppPresenter.detachView();
}
super.onDestroyView();
} @Override
public void onDestroy() {
//取消网络请求
OkHttpUtils.getInstance().cancelTag(okHttpTag);
super.onDestroy();
} private void initViews() {
btn_get = (Button) myView.findViewById(R.id.btn_get);
tv_show = (TextView) myView.findViewById(R.id.tv_show);
} /**初始化数据*/
private void initData() {
okHttpTag = this.getClass().getSimpleName();
} private void initEvents() {
btn_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (HttpUtil.isNetworkAvailable(mContext)) {
//执行网络请求接口
try {
mvpUpdateAppPresenter.updateVersion();//请求发现新版本接口
} catch (Exception e) {
e.printStackTrace();
}
}else{
ToastUtil.showShortToast(MyApplication.getAppContext().getResources().getString(R.string.network_enable));
}
}
});
} @Override
public void showLoading(String msg) {
//showProgressDialog("");//显示进度加载框
} @Override
public void hideLoading() {
//dismissProgressDialog();//隐藏进度加载框
} @Override
public void showToast(String msg) {
ToastUtil.showShortToast(msg);
} @Override
public String getOkHttpUtilTag() {
return okHttpTag;
} @Override
public void showFail(String msg) {
ToastUtil.showShortToast(msg);
} @Override
public void showNotNetWork(String msg) {
ToastUtil.showShortToast(msg);
} @Override
public void showUpdateDialog(UpdateVersionBean updateVersionBean) {
String showText = "新版本号:" + updateVersionBean.getVersionName() +
"\n是否强制更新:" + updateVersionBean.getForceUpdate() +
"\n标题:" + updateVersionBean.getTitle() +
"\n内容:" + updateVersionBean.getContent().replace("\\n", "\n") +
"\n文件大小:" + updateVersionBean.getFileSize() +
"\n下载地址:" + updateVersionBean.getDownloadurl();
tv_show.setText(showText);
}
}
混淆配置
参考《okhttputils【 Android 一个改善的okHttp封装库】使用(一)》
参考资料
暂时空缺
项目demo下载地址
https://github.com/haiyuKing/OkHttpUtilsMvpDemo
okhttputils【 Android 一个改善的okHttp封装库】使用(三)的更多相关文章
- okhttputils【 Android 一个改善的okHttp封装库】使用(一)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文使用的OKHttp封装库是张鸿洋(鸿神)写的,因为在项目中一直使用这个库,所以对于一些常用的请求方式都验证过,所以特此整理下. ...
- Android 一个改善的okHttp封装库
膜拜一下~ 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/49734867: 本文出自:[张鸿洋的博客] 一.概述 之前写了篇A ...
- okhttputils【 Android 一个改善的okHttp封装库】使用(二)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 上一篇讲了如何在项目中导入OKHttputils库的操作,这一篇主要讲常见请求的写法. get请求 public String getPe ...
- Android 一个改进的okHttp封装库
一.概述 之前写了篇Android OkHttp完全解析 是时候来了解OkHttp了,其实主要是作为okhttp的普及文章,当然里面也简单封装了工具类,没想到关注和使用的人还挺多的,由于这股热情,该工 ...
- 一个高性能异步socket封装库的实现思路 (c#)
前言 socket是软件之间通讯最常用的一种方式.c#实现socket通讯有很多中方法,其中效率最高就是异步通讯. 异步通讯实际是利用windows完成端口(IOCP)来处理的,关于完成端口实现原理, ...
- Android一个包含表格的图标库
之前有写过一个图表lib,但是开发的速度,大多很难跟上产品需求变化的脚步,所以修改了下原先的图表库,支持图表下面能整合table显示对应的类目,用曲线替换了折线,支持多曲线的显示,增加了显示的动画,, ...
- 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件
看到Andy_2020发的帖子“Altium Designer专题”之后,对Altium Designer的3D功能很感兴趣,着手自己做一个AD的3D封装库.刚开始按照Andy介绍的方法,学了两天So ...
- 毕加索的艺术——Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选
毕加索的艺术--Picasso,一个强大的Android图片下载缓存库,OkHttpUtils的使用,二次封装PicassoUtils实现微信精选 官网: http://square.github.i ...
- Android 设计模式实战之关于封装计费代码库的策略模式详谈
写在之前 这周生活上出现了很多的不如意,从周一开始就觉得哪里出现了问题,然后就是各种烦躁的情绪,后来事情还真是如预感的那样发生了,很是心痛,但也无可奈何,希望大家都好好珍惜自己身边的人:友人,亲人,家 ...
随机推荐
- C. Liebig's Barrels
You have m = n·k wooden staves. The i-th stave has length ai. You have to assemble nbarrels consisti ...
- Math.pow();Math.sqrt();
//Math.pow(a,b)功能是a的b次方 (int)Math.sqrt(n):先对n开方,然后转成int类型//例如,(int)Math.sqrt(2)=(int)1.414=1 Math.ab ...
- CyclicBarrier简介
CyclicBarrier简介 CyclicBarrier和CountDownLatch不同,是当await的数量达到了设定的数量之后,才继续往下执行 CyclicBarrier数的是调用了Cycli ...
- BZOJ_2962_序列操作_线段树
Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问 ...
- ll 和 ls -l的详解
ll会列出该文件下的所有文件信息,包括隐藏文件 而ls -l 只会列出显示文件 ll 命令列出的信息更加详细,有时间,是否可读写等信息 ll命令和ls -l命令结果区别: 上面结果说明: 各个字段的含 ...
- MIUI目前为止最简单安装谷歌服务框架教程
安装谷歌服务框架方法有很多,比如用第三方 rec卡刷gapps包.用第三方工具安装......然而这些对于新手来说还是比较难的! 我今天说的方法可以说是最简单的:1.不需要修改文件:2.不需要借助第三 ...
- 网页基础:网页设计(我所知道的所有的html和css代码(含H5和CSS3)),如有错误请批评指正
最基础的网页设计,就是给你一个图片你做成一个网页,当然,我的工作是C#,个人网页的功底不是很高首先先认识一下网页的一些相关知识: 一般的,现在一个html网页一般包含html文件,css文件,js文件 ...
- 基于ZigBee模块与51单片机之间的简化智能家居项目简介(学生版本)
5月份学校举行比赛,我们团队报名<智能家居>的项目,设计的总体思路用:QT写的上位机与ZigBee无线通信加51作为终端的简易版智能家居 电路连接:PC机->cc2530(协调器)- ...
- ES6语法的学习与实践
ES6是JavaScript语言的新一代标准,是ECMAScript的第六个版本,加入了很多新的功能和语法,在很多框架,如在使用Vue,React等框架的项目中一般都采用ES6语法来编写的,下面对经常 ...
- spring boot sharding-jdbc实现分佈式读写分离和分库分表的实现
分布式读写分离和分库分表采用sharding-jdbc实现. sharding-jdbc是当当网推出的一款读写分离实现插件,其他的还有mycat,或者纯粹的Aop代码控制实现. 接下面用spring ...