jsonrpc4j android,jsonrpc-4j代码解析
解析文件
AutoJsonRpcServiceImplExporter
JsonServiceExporter
AutoJsonRpcServiceImplExporter
路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter
AutoJsonRpcServiceImplExporter 是与spring 自动注册service启动类
实现 BeanFactoryPostProcessor 后置拦截器,具体了解可点击访问
postProcessBeanFactory() 是重载实现接口方法 也是该类入口;
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
//扫描注解@JsonRpcService 的类
DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
Map servicePathToBeanName = findServiceBeanDefinitions(defaultListableBeanFactory);
//循环注册Service,
for (Entry entry : servicePathToBeanName.entrySet()) {
registerServiceProxy(defaultListableBeanFactory, makeUrlPath(entry.getKey()), entry.getValue());
}
}
findServiceBeanDefinitions() 扫描注解@JsonRpcService 的类 形成 key-value 结果集 key 是jsonrpc注解值,value 是 servicebeanName名称. serviceBeanNames.put(path, beanName);
//TODO
registerServiceProxy(defaultListableBeanFactory, makeUrlPath(entry.getKey()), entry.getValue())
entry.getKey() 是jsonrpc注解值 entry.getValue() 是 servicebeanName名称
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(JsonServiceExporter.class).addPropertyReference("service", serviceBeanName);
registerServiceProxy 方法内部做了一些属性注入
if (objectMapper != null) {
builder.addPropertyValue("objectMapper", objectMapper);
}
if (errorResolver != null) {
builder.addPropertyValue("errorResolver", errorResolver);
}
if (invocationListener != null) {
builder.addPropertyValue("invocationListener", invocationListener);
}
if (registerTraceInterceptor != null) {
builder.addPropertyValue("registerTraceInterceptor", registerTraceInterceptor);
}
if (httpStatusCodeProvider != null) {
builder.addPropertyValue("httpStatusCodeProvider", httpStatusCodeProvider);
}
if (convertedParameterTransformer != null) {
builder.addPropertyValue("convertedParameterTransformer", convertedParameterTransformer);
}
if (contentType != null) {
//设置response类型
builder.addPropertyValue("contentType", contentType);
}
builder.addPropertyValue("backwardsCompatible", backwardsCompatible);
builder.addPropertyValue("rethrowExceptions", rethrowExceptions);
builder.addPropertyValue("allowExtraParams", allowExtraParams);
builder.addPropertyValue("allowLessParams", allowLessParams);
builder.addPropertyValue("shouldLogInvocationErrors", shouldLogInvocationErrors);
defaultListableBeanFactory 是IOC始祖,提定义Bean注册监听;
defaultListableBeanFactory.registerBeanDefinition(servicePath, builder.getBeanDefinition());
JsonServiceExporter 实现HtttpHandler,最终容器注册是这个Bean的实例.
class JsonServiceExporter extends AbstractJsonServiceExporter implements HttpRequestHandler {
//jsonRpcServer 顶级实例
private JsonRpcServer jsonRpcServer;
/**
* {@inheritDoc}
*/
@Override
protected void exportService() {
jsonRpcServer = getJsonRpcServer();
}
/**
* {@inheritDoc}
*/
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//核心方法执行入口
jsonRpcServer.handle(request, response);
response.getOutputStream().flush();
}
}
JsonRpcMultiServer
/**
* A multiple service dispatcher that supports JSON-RPC "method" names
* that use dot-notation to select a server endpoint. For example:
*
* {
* "jsonrpc": "2.0",
* "method": "service.method",
* "params": {"foo", "bar"},
* "id": 1
* }
*
* An example of using this class is:
*
* JsonRpcMultiServer rpcServer = new JsonRpcMultiServer();
* rpcServer.addService("Foo", new FooService())
* .addService("Bar", new BarService());
*
* A client can then call a test(String, String) method on the Foo service
* like this:
*
* {
* "jsonrpc": "2.0",
* "method": "Foo.test",
* "params": ["some", "thing"],
* "id": 1
* }
*
*/
转载至链接:https://my.oschina.net/guoenzhou/blog/1833075
jsonrpc4j android,jsonrpc-4j代码解析相关推荐
- android 事件分发 代码解析,Android事件分发之源码分析
原文首发于微信公众号:躬行之,欢迎关注交流! 上篇文章中叙述了 Android 事件分发的大致流程,下面从 Activity.ViewGroup.View 三个方面介绍事件的相关方法,小节如下: Ac ...
- 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中进行断点调试 | ELFFile 实例对象分析 )
文章目录 一.PyCharm 中进行断点调试 二.ELFFile 实例对象分析 一.PyCharm 中进行断点调试 在上一篇博客 [Android 逆向]使用 Python 代码解析 ELF 文件 ( ...
- android 滑动拦截,Android 滑动拦截实例代码解析
废话不多说了,直接给大家贴代码了,具体代码如下所示: package demo.hq.com.fby; import android.content.Context; import android.u ...
- android签名校验代码,Android签名验证解析
1.本文主要内容 知识回顾 签名验证解析 总结 本文介绍下Android在安装apk时,对签名的验证过程 2.知识回顾 在Android签名过程详解一文中,我已经详细说明签名的过程以及为什么要这么做, ...
- 安卓 linux init.rc,[原创]Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- android之json解析优化,Android开发之json解析
目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...
- Android网络之数据解析----SAX方式解析XML数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android init.rc文件解析过程详解(三)
Android init.rc文件解析过程详解(三) 三.相关结构体 1.listnode listnode结构体用于建立双向链表,这种结构广泛用于kernel代码中, android源代码中定义了l ...
- Android init.rc文件解析过程详解(二)
Android init.rc文件解析过程详解(二) 3.parse_new_section代码如下: void parse_new_section(struct parse_state *state ...
- Android init.rc文件解析过程详解(一)
Android init.rc文件解析过程详解(一) 一.init.rc文件结构介绍 init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字 ...
最新文章
- 【经典C#.NET入门教程】管理软件开发必备知识免费视频教程下载
- Mybatis常见面试题(10个必备面试题)
- 人工神经网络_制作属于自己的人工神经网络
- html作业本,小鹅通作业本使用教程
- Mysql 异步复制
- 一行代码能做什么? 看到最后一个我终于忍不住...
- 有没有更好的写v =(v == 0?1:0)的方法; [关闭]
- IDEA 查看源码快捷键
- 图像频域增强:带通带阻滤波器
- vue: table制作发货单表格并打印
- 无法通过计算机名访问 win10,win10系统主机名无法访问局域网共享的恢复方法
- 平面设计完全手册_什么是平面设计,做平面设计都要了解哪些基础知识点?
- 会声会影批量处理素材设置教程
- 【两天搞定小米商城】【第三步】小米商城之导航部分
- 字节女测试工程师万字总结的软件测试入门技巧
- 获取字符串长度的几种办法
- 虚拟机服务器双通道和四通道,双通道和四通道区别
- 计算机sci期刊必需要提交原始数据,sci投稿的时候需要附上原始数据和处理过程么...
- 解决高德地图在线API不支持对应的方法回调返回结果的问题
- linux menuconfig搜索,Linux make menuconfig查找并快速跳转指定驱动选项
热门文章
- 如何设置eclipse眼睛保护色-码农必备
- 服务器显示A40故障码,求助大神,车子出现故障码,5053无法消除
- java从JDK里提取全球数据,包含国家(名称、二字代码、三字代码)、币种(名称和代码)、和语言种类的数据
- 中国省份区域json
- c语言12个实验报告,C语言实验报告合集
- 关于Dll、Com组件、托管dll和非托管dll
- 软件测试报告模板怎么写,这篇文章告诉你
- K歌、短视频技术最佳实践——“唱吧”音视频技术探索
- landsat8简介
- 一个完整的html代码是什么,html是什么?一个完整的html代码告诉你(完整实例版)...