精华内容
下载资源
问答
  • 使用的自定义内容发布工作流程的演示。 文献资料 app/documentBadges app/lib app/schema app/scripts app/structure app/tools 这个项目怎么办? 该存储库的目的是提供一个示例,说明如何使用Sanity ...
  • demo

    千次阅读 2018-08-31 15:50:56
    7、NumberKeyboard-仿造android端闲鱼发布选择价格数字键盘自定义数字键盘 https://github.com/xuejinwei/NumberKeyboard 8、SwipeRecyclerView-自定义下拉刷新上拉加载控件SwipeRefreshLayout+recyclerView ...

    1、BeautifulRefreshLayout-漂亮的美食下拉刷新

    https://github.com/android-cjj/BeautifulRefreshLayout/tree/BeautifulRefreshForFood

    2、Material Design-动画风格的选项卡tab切换功能

    https://github.com/neokree/MaterialTabs

    3、TwinklingRefreshLayout-支持下拉刷新和上拉加载的RefreshLayout,自带越界回弹效果

    https://github.com/lcodecorex/TwinklingRefreshLayout

    4、DialogLoadding-Android开发之常用的loading等待效果实现,仿微博等待动画。两种实现方式详解

    https://github.com/QQ986945193/DialogLoadding

    5、owspace-完整高仿单读的APP,模仿得非常精美,基于MVP+Dagger2+Retrofit2.0+Rxjava

    https://github.com/babylikebird/owspace

    6、GSYVideoPlayer-android视频播放器,支持基本的拖动,声音、亮度调节,支持边播边缓存

    https://github.com/CarGuo/GSYVideoPlayer

    7、NumberKeyboard-仿造android端闲鱼发布选择价格数字键盘自定义数字键盘

    https://github.com/xuejinwei/NumberKeyboard

    8、SwipeRecyclerView-自定义下拉刷新上拉加载控件SwipeRefreshLayout+recyclerView

    https://github.com/niniloveyou/SwipeRecyclerView

    9、FloatingView-android能够让View执行漂亮的漂浮动画的库

    https://github.com/UFreedom/FloatingView

    10、TyperEditText-Android仿业问打字机效果,很炫酷

    https://github.com/andyxialm/TyperEditText

    11、CircularMenu-android自动绘制遥控器界面CircularMenu

    https://github.com/sungerk/CircularMenu/

    12、ConnectListView-ConnectListView联动,listView三级联动

    https://github.com/maning0303/ConnectListView

    13、DylanStepCount-Android精准计步器(小米,魅族,华为上可用)

    https://github.com/linglongxin24/DylanStepCount

    14、MultiType-FilePicker-MultiType-FilePicker-android一款轻量级的文件选择器,支持多种文件类型

    https://github.com/fishwjy/MultiType-FilePicker

    15、SuperTextView-一个功能强大的TextView,可以满足日常大部分布局方式

    https://github.com/lygttpod/SuperTextView

    16、Android-SpinKit-Android-SpinKit多个漂亮的加载效果

    https://github.com/ybq/Android-SpinKit

    17、PullToRefreshAndLoadMore-一个轻量下拉刷新上拉加载更多控件,已封装ListView

    https://github.com/woxingxiao/PullToRefreshAndLoadMore

    18、BluetoothHelper-安卓蓝牙操作库,把蓝牙请求封装像Http一样

    https://github.com/a-voyager/BluetoothHelper

    19、Luban-android最接近微信朋友圈的图片压缩算法

    https://github.com/Curzibn/Luban

    20、CBDialog-android一个快速创建对话框的工具类库

    https://github.com/yilylong/CBDialog

    21、UserGuideView-androidy应用实现用户指引view

    https://github.com/yilylong/UserGuideView

    22、okhttp一个让网络请求更简单的框架

    https://github.com/jeasonlzy/okhttp-OkGo

    23、TwinklingRefreshLayout-下拉刷新和上拉加载的RefreshLayout,自带越界回弹效果,支持RecyclerView,AbsListView,ScrollView,WebView

    https://github.com/lcodecorex/TwinklingRefreshLayout

    24、StickerCamera-android一款集成了相机,图片裁剪,给图片贴贴图打标签的APP

    https://github.com/Skykai521/StickerCamera

    25、AndroidFire-一款新闻阅读App框架基于Material Desig

    https://github.com/jaydenxiao2016/AndroidFire

    26、ViewPagerCards-android ViewPagerCards卡片切换效果源码

    https://github.com/rubensousa/ViewPagerCards

    27、Douya-Material Design 的豆芽客户端完整源码

    https://github.com/DreaminginCodeZH/Douya

    28、RestAPP-android网易云音乐界面源码

    https://github.com/sakurajiang/RestAPP

    29、huabanDemo-android 应用material design版的花瓣网App

    https://github.com/LiCola/huabanDemo

    30、slidingtutorial-android-slidingtutorial-android创建视差效果引导页的库自定义强使用简单

    https://github.com/Cleveroad/slidingtutorial-android

    31、DropDownMenu-android实用的多条件筛选菜单,非popupWindow实现无卡顿

    https://github.com/dongjunkun/DropDownMenu

    32、CouponView-android开发半圆锯齿背景虚线边框组合实现简单优惠券效果

    https://github.com/dongjunkun/CouponView

    33、Tuikan-一款集知乎头条,美图,视频于一体的休闲阅读app源码

    https://github.com/homcin/Tuikan

    34、UPMiss-andoorid一个完整的生日管理App

    https://github.com/qiujuer/UPMiss

    35、DropDownMenu-android完整的筛选器解决方案DropDownMenu

    https://github.com/baiiu/DropDownMenu

    36、StepView-android物流跟踪指示器StepView

    https://github.com/baoyachi/StepView

    37、StylishMusicPlayer-一个超棒的Android Music Player源码

    https://github.com/ryanhoo/StylishMusicPlayer

    38、MaterialTabs-Material Design动画风格的选项卡tab切换功能

    https://github.com/neokree/MaterialTabs

    39、GankWithZhihu-阅读类App(MVP + RxJava + Retrofit)

    https://github.com/Werb/GankWithZhihu

    40、MyCalendarDemo-一款Android日历提醒软件

    https://github.com/Werb/MyCalendarDemo

    41、MaterialHome-基于Material Design的图书展示类完整app采用的是MD设计风格

    https://github.com/hymanme/MaterialHome

    42、UpdateDemo-android app自动检测更新库

    https://github.com/hugeterry/UpdateDemo

    43、TaoSchool-android一款基于Material Desgin设计的APP

    https://github.com/Hankkin/TaoSchool

    44、RecyclerViewCardGallery-android使用RecyclerView实现Gallery画廊效果

    https://github.com/huazhiyuan2008/RecyclerViewCardGallery/

    45、CKCamera-android一个拍照并裁剪拍出照片的项目

    https://github.com/ChrisKyle/CKCamera

    46、SuperIndicator-android SuperIndicator 广告轮播源码

    https://github.com/hejunlin2013/SuperIndicator

    47、SignUpAnimation-android一个绚丽的注册动画界面

    https://github.com/qike2015/SignUpAnimation

    48、XRecyclerView-andorid RecyclerView下拉刷新,上拉加载更多

    https://github.com/jianghejie/XRecyclerView

    49、AutoInstaller-android应用自动下载静默安装

    https://github.com/a-voyager/AutoInstaller

    50、SeatTable-android在线电影票选座Demo

    https://github.com/qifengdeqingchen/SeatTable

    51、android-adDialog-android一个简单强大的广告活动弹窗控件

    https://github.com/yipianfengye/android-adDialog

    52、Android-FilePicker-android图片和文档选择器

    https://github.com/DroidNinja/Android-FilePicker

    53、ViewPagerCards-android卡片切换效果ViewPagerCards

    https://github.com/rubensousa/ViewPagerCards/

    54、CoCoin-一款完整的记账app(附带源码)

    https://github.com/Nightonke/CoCoin

    55、AndroidReview-一款面向Android开发者的一款面试复习App

    https://github.com/envyfan/AndroidReview

    56、Douya-开源Material Design豆瓣客户端源码

    https://github.com/DreaminginCodeZH/Douya

    57、android脑筋急转弯(完整数据版)源码

    http://pan.baidu.com/s/1c17AWXM zkw6

    58、DateScroller-探索日期滚轮控件的源码

    https://github.com/SpikeKing/DateScroller

    59、ZLayoutManager-五行代码实现 炫动滑动 卡片层叠布局,仿探探、人人影视订阅界面 简单&优雅:LayoutManager+ItemTouchHelper

    https://github.com/mcxtzhang/ZLayoutManager

    60、RNPolymerPo-基于 React Native 的 Android 企业级应用 Demo。

    https://github.com/yanbober/RNPolymerPo

    61、BoomMenu-漂亮的菜单弹出控件 BoomMenu

    https://github.com/Nightonke/BoomMenu

    62、MobileSafe-MobileSafe 是一个下载过两万并且非常适合初学者学习的项目(没错就是黑马手机卫士)

    https://github.com/JessYanCoding/MobileSafe

    63、KuaiChuan-仿茄子快传的一款文件传输应用

    https://github.com/mayubao/KuaiChuan

    64、SImageView-一个实用方便的图片控件SImageView

    https://github.com/suzeyu1992/SImageView

    65、WowSplash-不规则扩散的splash

    https://github.com/githubwing/WowSplash

    66、android-FancyBehaviorDemo-使用 CoordinatorLayout 实现复杂联动效果

    https://github.com/unixzii/android-FancyBehaviorDemo

    67、LbaizxfPulltoRefresh-仿健客、京东、天猫下拉刷新加载动画实现

    https://github.com/leibing8912/LbaizxfPulltoRefresh

    68、ZoomHeader-饿了么是怎么让Image变成详情页的

    https://github.com/githubwing/ZoomHeader

    69、XDroid-轻量级Android快速开发框架

    https://github.com/limedroid/XDroid

    70、CustomTextLayout-Android自定义组合控件(标题栏+组合布局)非常强大

    https://github.com/ithedan/CustomTextLayout

    71、QQ-高仿腾讯QQ,代码十分优雅

    https://github.com/HuTianQi/QQ

    72、YingBeautyNote-订个小目标,写个印象笔记

    https://github.com/HuTianQi/YingBeautyNote

    73、ZuiMeiTAG-用recyclerView实现最美应用底栏

    https://github.com/huage2580/ZuiMeiTAG

    74、ZuiMeiTAG-深入探索通知与插件的实时刷新

    https://github.com/SpikeKing/TimerAppWidget

    75、AnimationMenu-android 软软的动画弹出菜单,基于Facebook的Rebuond

    https://github.com/CarGuo/AnimationMenu

    76、WaveView-高仿百度外卖个人中心,让你的界面和我一起浪起来

    https://github.com/1139618418/WaveView

    77、shopcar-仿饿了么购物车下单效果

    https://github.com/917386389/shopcar

    78、RxJavaRetrofitOkhttpMvp-时下流行的RxJava+Retrofit+Okhttp+Mvp封装的一个demo

    https://github.com/gslovemy/RxJavaRetrofitOkhttpMvp

    79、BitmapWaveView-安卓自定义View在bitmap中玩转大波浪进度

    https://github.com/AndroidMsky/BitmapWaveView

    80、Android-PickerView-Library-Android高仿ios pickerView

    https://github.com/Airsaid/Android-PickerView-Library

    81、CustomNavigatorBar-Android通用标题栏组合控件

    https://github.com/wangluAndroid/CustomNavigatorBar

    82、SwipeDelMenuLayout-史上最简单,一步集成侧滑(删除)菜单,高仿QQ、IOS

    https://github.com/mcxtzhang/SwipeDelMenuLayout

    83、DragFooterView-向左拖拽跳转至“更多页面”的通用控件

    https://github.com/uin3566/DragFooterView

    84、VRefreshLayout-Android下拉刷新控件之header置顶显示效果

    https://github.com/ileelay/VRefreshLayout

    85、TransitionHelper-两步实现类似格瓦拉的转场动画

    https://github.com/ImmortalZ/TransitionHelper

    86、DialogFragment-自定义对话框应该这样写

    https://github.com/GitPhoenix/DialogFragment

    87、RefreshLayout-RefreshLayout让你半小时以内完成一个列表界面

    https://github.com/gengqiquan/RefreshLayout

    88、SwipeCardRecyclerView-如何利用RecyclerView打造炫酷滑动卡片

    https://github.com/HalfStackDeveloper/SwipeCardRecyclerView

    89、LookLook-一个小时打造新闻app

    https://github.com/xinghongfei/LookLook

    90、JPTabBar-一款强大的Android底部导航

    https://github.com/peng8350/JPTabBar

    91、ByeBurger-炫酷:一句代码实现标题栏、导航栏滑动隐藏,ByeBurger库的使用和实现

    https://github.com/githubwing/ByeBurger

    92、CommonRecycler-通用 RecylerAdapter,内置 XRecyclerView,兼容上下拉与动画,高复用,一个 Adapter 通用所有页面,支持空页面,懒人专属

    https://github.com/CarGuo/CommonRecycler

    93、FreeBook-先定一个小目标!比如说先用MVP和快速开发框架打造一个免费下载小说的app老司机来手把手教你半天搞定

    https://github.com/80945540/FreeBook

    94、IjkPlayerView-基于ijkplayer的视频播放器,仿Bilibili客户端,集成沉浸式全屏、弹幕、触屏控制、视频源切换等功能

    https://github.com/Rukey7/IjkPlayerView

    95、CoolImageView-非常酷的图片组件,类似腾讯 QQ 可以让 imageview 的图片背景上下移动,或左右移动

    https://github.com/HuTianQi/CoolImageView

    96、AWelcomeVideoPager-ndroid酷炫欢迎页播放视频,仿蚂蜂窝自由行和慕课网

    https://github.com/linglongxin24/WelcomeVideoPager

    97、validateui-一个表单验证的lib

    https://github.com/LongMaoC/validateui

    98、CollapseView-Android仿安居客房源详情页图片显示

    https://github.com/xiaoqiAndroid/CollapseView/tree/master

    99、HintPopupWindow-比QQ更炫酷的'选项弹窗'动画

    https://github.com/Zhaoss/HintPopupWindow

    100、RecyclerViewDemo2- 精通RecyclerView:打造ListView、GridView、瀑布流;学会添加分割线、 添加删除动画 、Item点击事件

    https://github.com/linglongxin24/RecyclerViewDemo2

    101、TinderStackView-Android高仿「陌陌」的点点效果

    https://github.com/Mersens/TinderStackView

    102、MvpDemo-优雅的构建Android项目之 MVP开发模式

    https://github.com/PandaQAQ/MvpDemo

    103、Material Animations -演示View的平移、缩放动画,activity进入和退出动画,界面间元素共享,并且开发者在README中,对动画原理进行了精讲,是学习动画很好的项目,项目代码量比较少,也很适合新手学习。

    https://github.com/lgvalle/Material-Animations

    104、Meizhi-每天推送一张妹子图、一个小视频和一系列程序员精选文章,数据来源于代码家的干货集中营。唯一不足就是视频解析还有bug,声音视频无法同步,希望能尽快修复。

    https://github.com/drakeet/Meizhi

    105、android-UniversalMusicPlayer-这个开源项目展示了如何实现一个横跨各种Android平台的音乐播放器,包括手机,平板,汽车,手表,电视等。Google官方推出,跨平台开发必看项目。

    https://github.com/googlesamples/android-UniversalMusicPlayer

    106、plaid-由谷歌工程师开发,展示Google Material风格设计,项目代码量大,但是结构清晰,还是很好理解的。

    https://github.com/nickbutcher/plaid

    107、CalendarView-Android 滚轮日期选择自定义View

    https://github.com/chenpengfei88/CalendarView

    108、AndroidMVPSample-一套完整的Android通用框架

    https://github.com/WuXiaolong/AndroidMVPSample

    109、CoordinatorLayoutTest-高仿支付宝9.9.2版本生活模块界面来讲解CoordinatorLayout,AppBarLayout,CollapsingToolbarLayout

    https://github.com/jack921/CoordinatorLayoutTest

    110、SideSlip_PullToRefresh-Android 集成了RecyclerView 刷新加载,及侧滑菜单的 PullToRefresh

    https://github.com/lvfaqiang/SideSlip_PullToRefresh

    111、SideSlip_PullToRefresh-通用Android标题栏控件

    https://github.com/xiaohaibin/CustomTitileBar

    112、CalendarView-Android 自定义价格日历控件

    https://github.com/yissan/CalendarView

    113、ZhiHuDaily-纸飞机-采用MVP架构,集合了知乎日报、果壳精选和豆瓣一刻的综合性阅读客户端

    https://github.com/marktony/ZhiHuDaily

    114、ZhiHuDaily-仅2步实现 拜拜 汉堡导航栏效果~ 全新底部导航交互(滑动隐藏)

    https://github.com/githubwing/ByeBurger

    115、FloatBubbleView-Android:会呼吸的悬浮气泡

    https://github.com/IamXiaRui/Android_5.0_ViewDemo/tree/master/FloatBubbleView

    116、ByeBurger-极其简便的快速实现滑动隐藏标题栏和导航栏

    https://github.com/githubwing/ByeBurger

    117、NotificationUtil-全新的Android通知栏,已抛弃setLatestEventInfo,兼容高版本

    https://github.com/linglongxin24/NotificationUtil

    118、LauncherView-十分钟搞定酷炫动画,Android自定义 View 入门

    https://github.com/diamondlin2016/LauncherView

    119、LiveShow-使用MVP+RxJava制作的笑话APP

    https://github.com/GaoGersy/LiveShow

    120、ChargeProgress-android 自定义view+属性动画实现充电进度条功能

    https://github.com/crazyandcoder/ChargeProgress

    121、Notes-炫酷的ViewPager动画效果

    https://github.com/Elder-Wu/Notes

    122、ElasticLayout-超轻量!安卓实现多item抽屉效果动画

    https://github.com/AndroidMsky/ElasticLayout

    123、SuperTextView-SuperTextView 一款强大的android TextView

    https://github.com/lygttpod/SuperTextView

    124、SuperTextView-自定义LayoutManager实现一个展示文章的View,支持拖动插入以及相应的动画展示

    https://github.com/rantianhua/AssembleEssay

    125、VideoRecord-Android 拍摄(横 \ 竖屏)视频的懒人之路

    https://github.com/CarGuo/VideoRecord

    126、Telegram-著名IM应用Telegram源码

    https://github.com/DrKLO/Telegram

    127、Notes-自定义View系列:未读消息数角标

    https://github.com/Elder-Wu/Notes

    128、BeautifulWords-Android开源实战:使用MVP+Retrofit开发一款文字阅读APP

    https://github.com/zuiwuyuan/BeautifulWords

    129、Notes-自定义ViewPager——左右无限循环,带指示器

    https://github.com/Elder-Wu/Notes

    130、Myprogress-安卓Android多阶段进度条progress bar附带动画效果

    https://github.com/AndroidMsky/Myprogress

    131、SpannableStringBiulderTest-直接拿去用!几种常见Dialog,懒人必收

    https://github.com/weavey/NormalSelectDialog

    132、SpannableStringBiulderTest-【Android】强大的SpannableStringBuilder

    https://github.com/Gavin-ZYX/SpannableStringBiulderTest

    133、Ghost-微影,一款纯粹的在线视频App,基于Material Design + MVP + RxJava + Retrofit + Realm + Glide

    https://github.com/GeekGhost/Ghost

    134、SwipeRecyclerView-自定义下拉刷新上拉加载控件(SwipeRefreshLayout + recyclerView)

    https://github.com/niniloveyou/SwipeRecyclerView

    135、ViewDragHelperDemo-Android自定义ViewGroup神器-ViewDragHelper

    https://github.com/hiphonezhu/Android-Demos/tree/master/ViewDragHelperDemo

    136、UserDefinedProgressBar-好玩的动画加载和自定义ProgressBar

    https://github.com/junmei520/UserDefinedProgressBar

    137、MPermissionUtils-Android6.0 运行时权限 超轻量级工具类

    https://github.com/Airsaid/MPermissionUtils

    138、EmptyLayout-Android通用的EmptyLayout-展示不用状态的界面

    https://github.com/yewei02538/EmptyLayout

    139、NestFullListView-【Android】ListView、RecyclerView、ScrollView里嵌套ListView 相对优雅的解决方案:NestFullListView

    https://github.com/mcxtzhang/NestFullListView

    140、WindowMenuDemo-Android仿Qzone底部导航栏加号弹出菜单

    https://github.com/MjCodeTinker/WindowMenuDemo

    141、SmileRefresh-微笑下拉刷新。这是在 SwipeRefreshLayout基础上修改的下拉刷新库。

    https://github.com/songixan/SmileRefresh

    142、MyCartDemo-Android自定义View--自己撸一个柱状图也没那么难

    https://github.com/Hankkin/MyCartDemo

    143、MDStudySamples-Android TabLayout 分分钟打造一个滑动标签页

    https://github.com/Mike-bel/MDStudySamples

    144、WingUE-基本特效:饿了么丝滑无缝过度搜索栏的实现

    https://github.com/githubwing/WingUE

    145、史上最牛逼的音乐播放器—仿网易云音乐(已开源)

    https://github.com/aa112901/remusic

    146、GABottleLoading-贝塞尔风暴 - 超炫GABottleLoading效果

    https://github.com/Ajian-studio/GABottleLoading

    147、PathAnimView-【注释张豪华版 Path酷炫动画】极速get花式Path (支付宝支付成功动画)

    https://github.com/mcxtzhang/PathAnimView

    148、Material Design : 带动画的标题栏

    https://github.com/shiguiyou/MaterialDemo/tree/master

    149、MultiTypeAdapter-优雅的实现多类型列表的Adapter

    https://github.com/LiHongHui6/MultiTypeAdapter

    150、AnimationPlayer-探索View动画和属性动画

    https://github.com/SpikeKing/AnimationPlayer

    151、AnimShopButton-仿饿了么加入购物车旋转控件 - 自带闪转腾挪动画 的按钮

    https://github.com/mcxtzhang/AnimShopButton

    152、YinyuetaiPlayer-高仿音悦台播放页面交互效果

    https://github.com/oubowu/YinyuetaiPlayer

    153、AndroidAnimationExercise-Android 动画实战 - 仿微博雷达功能

    https://github.com/REBOOTERS/AndroidAnimationExercise

    154、简诗,这个项目依赖了当前最流行的 Android 库来搭建稳定简洁的架构,包含数据层、网络层、Rx 层、依赖注入、图片加载、崩溃监测等,最良心的是该开源项目甚至包含了 Android 端和 Server 端,支持登录注册,数据云端同步,离线数据存储和截屏分享等功能,最最良心的是作者还用心的写了一篇文章,从创意、设计,到开发、架构来详细说明了「如何在一天之内完成一款具备 cool 属性的 Android 产品」。

    http://www.jianshu.com/p/cf496fc408b2
    https://github.com/wingjay/jianshi/

    155、这是一款仿iOS的PickerView控件,有时间选择和选项选择,并支持一二三级联动,支持自定义样式

    https://github.com/Bigkoo/Android-PickerView

    156、mvp+rxjava+retrofit框架实现的新闻客户端demo,逻辑简单,适合新人入手

    https://github.com/xu649526275/MyMVPDemo

    157、Kotlin资料大全--学习kotlin,这一篇就够了

    https://juejin.im/post/591dd9f544d904006c9fbb96

    158、一个电商项目【拉手团购】购物App

    https://github.com/myxh/CoolShopping

    159、所有图片选择在这里

    https://www.2cto.com/kf/201702/604527.html

    展开全文
  • 一个小demo:基于 RabbitMQ 的消息发布与订阅

    pom.xml

    		<dependency>
    			<groupId>com.rabbitmq</groupId>
    			<artifactId>amqp-client</artifactId>
    			<version>4.1.0</version>
    		</dependency>
    

    RabbitMQ 连接配置工具类

    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    
    public class ChannelUtils {
    
        public static Channel getChannelInstance(String connectionDescription) {
            try {
                ConnectionFactory connectionFactory = getConnectionFactory();
                // 创建连接
                Connection connection = connectionFactory.newConnection(connectionDescription);
                return connection.createChannel();
            } catch (Exception e) {
                throw new RuntimeException("获取Channel连接失败");
            }
        }
    
        /**
         * 功能描述:
         * <连接配置>
         *
         *
         * @return com.rabbitmq.client.ConnectionFactory
         * @author zhoulipu
         * @date   2019/7/31 18:02
         */
        private static ConnectionFactory getConnectionFactory() {
            ConnectionFactory connectionFactory = new ConnectionFactory();
            // 配置连接信息
            connectionFactory.setHost("127.0.0.1");
            connectionFactory.setPort(5672);
            connectionFactory.setVirtualHost("/");
            connectionFactory.setUsername("guest");
            connectionFactory.setPassword("guest");
            // 失败重连模式:网络异常自动重新连接
            connectionFactory.setAutomaticRecoveryEnabled(true);
            // 失败重连模式:每10秒重试连接
            connectionFactory.setNetworkRecoveryInterval(10000);
            // 失败重连模式:重新声明交换器,队列等信息
            connectionFactory.setTopologyRecoveryEnabled(true);
            return connectionFactory;
        }
    
    }
    

    生产者发布消息

    import com.rabbitmq.client.*;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Scanner;
    
    public class Producer {
    
        /**
         * 交换机名称(需与消费者保持一致)
         */
        private static final String pbxName = "PBX";
    
        /**
         * 路由密匙(需与消费者保持一致)
         */
        private static final String routingKey = "routingKey";
    
        public static void main(String[] args) throws IOException {
            // 获取连接
            Channel channel = ChannelUtils.getChannelInstance("队列消息生产者");
            // 生产者配置
            AMQP.BasicProperties basicProperties = producerConfig(channel, pbxName);
            while (true) {
                System.out.print("请输入即将发布的消息:");
                Scanner str = new Scanner(System.in);
                // 发布消息
                publish(channel, basicProperties, pbxName, routingKey, str.next());
                System.out.println("消息已发布,请查看订阅者状态");
            }
        }
    
        /**
         * 功能描述:
         * <生产者发布消息>
         *
         * @param channel         1
         * @param basicProperties 2
         * @param pbxName         3
         * @param routingKey      4
         * @param msg             5
         * @return void
         * @author zhoulipu
         * @date 2019/7/31 17:52
         */
        public static void publish(Channel channel, AMQP.BasicProperties basicProperties, String pbxName, String routingKey, String msg) throws IOException {
            // 发布消息(交换机名, 路由关键字, 是否为强制性, 消息属性, 消息体);
            channel.basicPublish(pbxName, routingKey, false, basicProperties, msg.getBytes());
        }
    
        /**
         * 功能描述:
         * <生产者配置>
         *
         * @param channel 1
         * @param pbxName 2
         * @return com.rabbitmq.client.AMQP.BasicProperties
         * @author zhoulipu
         * @date 2019/7/31 17:52
         */
        public static AMQP.BasicProperties producerConfig(Channel channel, String pbxName) throws IOException {
            // 声明交换机 (交换机名称, 交换机类型, 是否持久化, 是否自动删除, 是否是内部交换机(客户机直接发送消息), 队列中的消息自动删除配置);
            channel.exchangeDeclare(pbxName, BuiltinExchangeType.DIRECT, true, false, false, new HashMap<>());
            // 消息属性
            AMQP.BasicProperties basicProperties = new AMQP.BasicProperties().builder()
                    .deliveryMode(2) // 设置消息是否持久化,1: 非持久化 2:持久化
                    .contentType("UTF-8")
                    .contentEncoding("UTF-8")
                    .headers(new HashMap<>())
                    .build();
            return basicProperties;
        }
    
    }
    

    消费者订阅消息

    import com.rabbitmq.client.*;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Consumer {
    
        /**
         * 交换机名称(需与消费者保持一致)
         */
        private static final String pbxName = "PBX";
    
        /**
         * 路由密匙(需与消费者保持一致)
         */
        private static final String routingKey = "routingKey";
    
    
        public static void main(String[] args) throws IOException {
            // 队列名称(多个消费者需使用不同队列名称)
            String queueName = "queueName";
            // 获取连接
            Channel channel = ChannelUtils.getChannelInstance("队列消息消费者");
            // 消费者配置(交换机、路由、队列)
            AMQP.Queue.DeclareOk declareOk = consumerConfig(channel, pbxName, routingKey, queueName);
            // 订阅消息
            subscribe(channel, declareOk, "消费者名称");
        }
    
        /**
         * 功能描述:
         * <消费者订阅消息>
         *
         * @param channel     1
         * @param declareOk   2
         * @param consumerTag 3
         * @return void
         * @author zhoulipu
         * @date 2019/7/31 17:51
         */
        public static void subscribe(Channel channel, AMQP.Queue.DeclareOk declareOk, String consumerTag) throws IOException {
            // 消费者订阅消息 监听队列 (队列名, 是否自动应答(与消息可靠有关 后续会介绍), 消费者标签, 消费者)
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
                    System.out.println("consumerTag:" + consumerTag);
                    System.out.println("envelope:" + envelope.toString());
                    System.out.println("properties:" + properties.toString());
                    System.out.println("消息内容:" + new String(body));
                }
            };
            // 回调(队列名,是否自动确认消息,消费者)
            channel.basicConsume(declareOk.getQueue(), true, consumerTag, defaultConsumer);
        }
    
        /**
         * 功能描述:
         * <消费者配置>
         *
         * @param channel    1
         * @param pbxName    2
         * @param routingKey 3
         * @param queueName  4
         * @return com.rabbitmq.client.AMQP.Queue.DeclareOk
         * @author zhoulipu
         * @date 2019/7/31 17:51
         */
        public static AMQP.Queue.DeclareOk consumerConfig(Channel channel, String pbxName, String routingKey, String queueName) throws IOException {
            // 消息过期配置(文末对参数有简述)
            Map<String, Object> arguments = new HashMap<String, Object>();
            // 声明队列 (队列名, 是否持久化, 是否排他, 是否自动删除, 队列中的消息自动删除配置);
            AMQP.Queue.DeclareOk declareOk = channel.queueDeclare(queueName, true, false, false, arguments);
            // 将队列Binding到交换机上 (队列名, 交换机名, 路由关键字);
            channel.queueBind(declareOk.getQueue(), pbxName, routingKey);
            return declareOk;
        }
        
    }
    

    部分参数说明

    basicProperties:

    属性解释
    String contentType上下文类型
    String contentEncoding编码集
    Map<String,Object> headers消息头
    Integer deliveryMode消息的投递模式
    Integer priority优先级
    String correlationId自定义关联ID
    String replyTo回复对象
    String expiration过期时间
    String messageId消息编号
    Date timestamp发送消息时的时间戳
    String type消息类型

    arguments:

    key解释
    x-message-ttl队列中的所有消息的过期时间
    x-expires超过设定时间没有消费者来访问队列,就删除队列的时间(毫秒)
    x-max-length队列的最新的消息数量,如果超过设定数量,前面的消息将从队列中移除掉
    x-max-length-bytes队列的内容的最大空间,超过该阈值就删除之前的消息
    x-dead-letter-exchange如果队列中的消息被拒绝或过期,则可以根据设置的交换机对消息进行转发,重新发布
    x-dead-letter-routing-key将删除的消息推送到指定的交换机对应的路由键(路由密匙)
    x-max-priority队列支持的最大优先级数;如果未设置,队列将不支持消息优先级,优先级大的优先被消费
    x-queue-mode将队列设置为延迟模式,队列中的消息保存在磁盘中,但不会主动持久化,RabbitMQ重启后消息还是会丢失
    x-queue-master-locator将队列设置为主位置模式,确定在节点集群上声明时队列主机所在的规则
    展开全文
  • Android彻底组件化demo发布

    千次阅读 热门讨论 2017-09-08 20:06:34
    首先我们看一下demo的代码结构,然后根据这个结构图再次从单独调试(发布)、组件交互、UI跳转、集成调试、代码边界和生命周期等六个方面深入分析,之所以说“再次”,是因为上一篇文章我们已经讲了这六个方面的原理...

    今年6月份开始,我开始负责对“得到app”的android代码进行组件化拆分,在动手之前我查阅了很多组件化或者模块化的文章,虽然有一些收获,但是很少有文章能够给出一个整体且有效的方案,大部分文章都只停留在组件单独调试的层面上,涉及组件之间的交互就很少了,更不用说组件生命周期、集成调试和代码边界这些最棘手的问题了。有感于此,我觉得很有必要设计一套完整的组件化方案,经过几周的思考,反复的推倒重建,终于形成了一个完整的思路,整理在我的第一篇文章中Android彻底组件化方案实践。这两个月以来,得到的Android团队按照这个方案开始了组件化的拆分,经过两期的努力,目前已经拆分两个大的业务组件以及数个底层lib库,并对之前的方案进行了一些完善。从使用效果上来看,这套方案完全可以达到了我们之前对组件化的预期,并且架构简单,学习成本低,对于一个急需快速组件化拆分的项目是很适合的。现在将这套方案开源出来,欢迎大家共同完善。代码地址:https://github.com/luojilab/DDComponentForAndroid

    虽说开源的是一个整体的方案,代码量其实很少,简单起见demo中做了一些简化,请大家在实际应用中注意一下几点:
    (1)目前组件化的编译脚本是通过一个gradle plugin提供的,现在这个插件发布在本地的repo文件夹中,真正使用的使用请发布到自己公司的maven库
    (2)组件开发完成后发布aar到公共仓库,在demo中这个仓库用componentrelease的文件夹代替,这里同样需要换成本地的maven库
    (3)方案更侧重的是单独调试、集成编译、生命周期和代码边界等方面,我认为这几部分是已发表的组件化方案所缺乏的或者比较模糊的。组件之间的交互采用接口+实现的方式,UI之间的跳转用的是一个中央路由的方式,在这两方面目前已有一些更完善的方案,例如通过注解来暴露服务以及自动生成UI跳转代码等,这也是该方案后面需要着力优化的地方。如果你已经有更好的方案,可以替换,更欢迎推荐给我。

    一、AndroidComponent使用指南

    首先我们看一下demo的代码结构,然后根据这个结构图再次从单独调试(发布)、组件交互、UI跳转、集成调试、代码边界和生命周期等六个方面深入分析,之所以说“再次”,是因为上一篇文章我们已经讲了这六个方面的原理,这篇文章更侧重其具体实现。

    AndroidComponent结构图.png

    代码中的各个module基本和图中对应,从上到下依次是:
    - app是主项目,负责集成众多组件,控制组件的生命周期
    - reader和share是我们拆分的两个组件
    - componentservice中定义了所有的组件提供的服务
    - basicres定义了全局通用的theme和color等公共资源
    - basiclib中是公共的基础库,一些第三方的库(okhttp等)也统一交给basiclib来引入

    图中没有体现的module有两个,一个是componentlib,这个是我们组件化的基础库,像Router/UIRouter等都定义在这里;另一个是build-gradle,这个是我们组件化编译的gradle插件,也是整个组件化方案的核心。

    我们在demo中要实现的场景是:主项目app集成reader和share两个组件,其中reader提供一个读书的fragment给app调用(组件交互),share提供一个activity来给reader来调用(UI跳转)。主项目app可以动态的添加和卸载share组件(生命周期)。而集成调试和代码边界是通过build-gradle插件来实现的。

    1 单独调试和发布

    单独调试的配置与上篇文章基本一致,通过在组件工程下的gradle.properties文件中设置一个isRunAlone的变量来区分不同的场景,唯一的不同点是在组件的build.gradle中不需要写下面的样板代码:

    if(isRunAlone.toBoolean()){    
    apply plugin: 'com.android.application'
    }else{  
     apply plugin: 'com.android.library'
    }
    

    而只需要引入一个插件com.dd.comgradle(源码就在build-gradle),在这个插件中会自动判断apply com.android.library还是com.android.application。实际上这个插件还能做更“智能”的事情,这个在集成调试章节中会详细阐述。

    单独调试所必须的AndroidManifest.xml、application、入口activity等类定义在src/main/runalone下面,这个比较简单就不赘述了。

    如果组件开发并测试完成,需要发布一个release版本的aar文件到中央仓库,只需要把isRunAlone修改为false,然后运行assembleRelease命令就可以了。这里简单起见没有进行版本管理,大家如果需要自己加上就好了。值得注意的是,发布组件是唯一需要修改isRunAlone=false的情况,即使后面将组件集成到app中,也不需要修改isRunAlone的值,既保持isRunAlone=true即可。所以实际上在Androidstudio中,是可以看到三个application工程的,随便点击一个都是可以独立运行的,并且可以根据配置引入其他需要依赖的组件。这背后的工作都由com.dd.comgradle插件来默默完成。

    项目中有三个application工程.png

    2 组件交互

    在这里组件的交互专指组件之间的数据传输,在我们的方案中使用的是接口+实现的方式,组件之间完全面向接口编程。

    在demo中我们让reader提供一个fragment给app使用来说明。首先reader组件在componentservice中定义自己的服务

    public interface ReadBookService {
        Fragment getReadBookFragment();
    }

    然后在自己的组件工程中,提供具体的实现类ReadBookServiceImpl:

    public class ReadBookServiceImpl implements ReadBookService {
        @Override
        public Fragment getReadBookFragment() {
            return new ReaderFragment();
        }
    }

    提供了具体的实现类之后,需要在组件加载的时候把实现类注册到Router中,具体的代码在ReaderAppLike中,ReaderAppLike相当于组件的application类,这里定义了onCreate和onStop两个生命周期方法,对应组件的加载和卸载。

    public class ReaderAppLike implements IApplicationLike {
        Router router = Router.getInstance();
        @Override
        public void onCreate() {
            router.addService(ReadBookService.class.getSimpleName(), new ReadBookServiceImpl());
        }
        @Override
        public void onStop() {
            router.removeService(ReadBookService.class.getSimpleName());
        }
    }

    在app中如何使用如reader组件提供的ReaderFragment呢?注意此处app是看不到组件的任何实现类的,它只能看到componentservice中定义的ReadBookService,所以只能面向ReadBookService来编程。具体的实例代码如下:

    Router router = Router.getInstance();
    if (router.getService(ReadBookService.class.getSimpleName()) != null) {
        ReadBookService service = (ReadBookService) router.getService(ReadBookService.class.getSimpleName());
        fragment = service.getReadBookFragment();
        ft = getSupportFragmentManager().beginTransaction();
        ft.add(R.id.tab_content, fragment).commitAllowingStateLoss();
    }

    这里需要注意的是由于组件是可以动态加载和卸载的,因此在使用ReadBookService的需要进行判空处理。我们看到数据的传输是通过一个中央路由Router来实现的,这个Router的实现其实很简单,其本质就是一个HashMap,具体代码大家参见源码。

    通过上面几个步骤就可以轻松实现组件之间的交互,由于是面向接口,所以组件之间是完全解耦的。至于如何让组件之间在编译阶段不不可见,是通过上文所说的com.dd.comgradle实现的,这个在第一篇文章中已经讲到,后面会贴出具体的代码。

    3 UI跳转

    页面(activity)的跳转也是通过一个中央路由UIRouter来实现,不同的是这里增加了一个优先级的概念。具体的实现就不在这里赘述了,代码还是很清晰的。

    页面的跳转通过短链的方式,例如我们要跳转到share页面,只需要调用

    UIRouter.getInstance().openUri(getActivity(), "componentdemo://share", null);

    具体是哪个组件响应componentdemo://share这个短链呢?这就要看是哪个组件处理了这个schme和host,在demo中share组件在自己实现的ShareUIRouter中声明了自己处理这个短链,具体代码如下:

    private static final String SCHME = "componentdemo";
    private static final String SHAREHOST = "share";
    public boolean openUri(Context context, Uri uri, Bundle bundle) {
        if (uri == null || context == null) {
            return true;
        }
        String host = uri.getHost();
        if (SHAREHOST.equals(host)) {
            Intent intent = new Intent(context, ShareActivity.class);
            intent.putExtras(bundle == null ? new Bundle() : bundle);
            context.startActivity(intent);
            return true;
        }
        return false;
    }

    在这里如果已经组件已经响应了这个短链,就返回true,这样更低优先级的组件就不会接收到这个短链。

    目前根据schme和host跳转的逻辑是开发人员自己编写的,这块后面要修改成根据注解生成。这部分已经有一些优秀的开源项目可以参考,如ARouter等。

    4 集成调试

    集成调试可以认为由app或者其他组件充当host的角色,引入其他相关的组件一起参与编译,从而测试整个交互流程。在demo中app和reader都可以充当host的角色。在这里我们以app为例。

    首先我们需要在根项目的gradle.properties中增加一个变量mainmodulename,其值就是工程中的主项目,这里是app。设置为mainmodulename的module,其isRunAlone永远是true。

    然后在app项目的gradle.properties文件中增加两个变量:

    debugComponent=readercomponent,com.mrzhang.share:sharecomponent
    compileComponent=readercomponent,sharecomponent

    其中debugComponent是运行debug的时候引入的组件,compileComponent是release模式下引入的组件。我们可以看到debugComponent引入的两个组件写法是不同的,这是因为组件引入支持两种语法,module或者modulePackage:module,前者直接引用module工程,后者使用componentrelease中已经发布的aar。

    注意在集成调试中,要引入的reader和share组件是不需要把自己的isRunAlone修改为false的。我们知道一个application工程是不能直接引用(compile)另一个application工程的,所以如果app和组件都是isRunAlone=true的话在正常情况下是编译不过的。秘密就在于com.dd.comgradle会自动识别当前要调试的具体是哪个组件,然后把其他组件默默的修改为library工程,这个修改只在当次编译生效。

    如何判断当前要运行的是app还是哪个组件呢?这个是通过task来判断的,判断的规则如下:
    - assembleRelease → app
    - app:assembleRelease或者 :app:assembleRelease → app
    - sharecomponent:assembleRelease 或者:sharecomponent:assembleRelease→ sharecomponent

    上面的内容要实现的目的就是每个组件可以直接在Androidstudio中run,也可以使用命令进行打包,这期间不需要修改任何配置,却可以自动引入依赖的组件。这在开发中可以极大加快工作效率。

    5 代码边界

    至于依赖的组件是如何集成到host中的,其本质还是直接使用compile project(…)或者compile modulePackage:module@aar。那么为啥不直接在build.gradle中直接引入呢,而要经过com.dd.comgradle这个插件来进行诸多复杂的操作?原因在第一篇文章中也讲到了,那就是组件之间的完全隔离,也可以称之为代码边界。如果我们直接compile组件,那么组件的所有实现类就完全暴露出来了,使用方就可以直接引入实现类来编程,从而绕过了面向接口编程的约束。这样就完全失去了解耦的效果了,可谓前功尽弃。

    那么如何解决这个问题呢?我们的解决方式还是从分析task入手,只有在assemble任务的时候才进行compile引入。这样在代码的开发期间,组件是完全不可见的,因此就杜绝了犯错误的机会。具体的代码如下:

      /**
     * 自动添加依赖,只在运行assemble任务的才会添加依赖,因此在开发期间组件之间是完全感知不到的,这是做到完全隔离的关键
     * 支持两种语法:module或者modulePackage:module,前者之间引用module工程,后者使用componentrelease中已经发布的aar
     * @param assembleTask
     * @param project
     */
    private void compileComponents(AssembleTask assembleTask, Project project) {
        String components;
        if (assembleTask.isDebug) {
            components = (String) project.properties.get("debugComponent")
        } else {
            components = (String) project.properties.get("compileComponent")
        }
        if (components == null || components.length() == 0) {
            return;
        }
        String[] compileComponents = components.split(",")
        if (compileComponents == null || compileComponents.length == 0) {
            return;
        }
        for (String str : compileComponents) {
            if (str.contains(":")) {
                File file = project.file("../componentrelease/" + str.split(":")[1] + "-release.aar")
                if (file.exists()) {
                    project.dependencies.add("compile", str + "-release@aar")
                } else {
                    throw new RuntimeException(str + " not found ! maybe you should generate a new one ")
                }
            } else {
                project.dependencies.add("compile", project.project(':' + str))
            }
        }
    }

    6 生命周期

    在上一篇文章中我们就讲过,组件化和插件化的唯一区别是组件化不能动态的添加和修改组件,但是对于已经参与编译的组件是可以动态的加载和卸载的,甚至是降维的。

    首先我们看组件的加载,使用章节5中的集成调试,可以在打包的时候把依赖的组件参与编译,此时你反编译apk的代码会看到各个组件的代码和资源都已经包含在包里面。但是由于每个组件的唯一入口ApplicationLike还没有执行oncreate()方法,所以组件并没有把自己的服务注册到中央路由,因此组件实际上是不可达的。

    在什么时机加载组件以及如何加载组件?目前com.dd.comgradle提供了两种方式,字节码插入和反射调用。
    - 字节码插入模式是在dex生成之前,扫描所有的ApplicationLike类(其有一个共同的父类),然后通过javassisit在主项目的Application.onCreate()中插入调用ApplicationLike.onCreate()的代码。这样就相当于每个组件在application启动的时候就加载起来了。
    - 反射调用的方式是手动在Application.onCreate()中或者在其他合适的时机手动通过反射的方式来调用ApplicationLike.onCreate()。之所以提供这种方式原因有两个:对代码进行扫描和插入会增加编译的时间,特别在debug的时候会影响效率,并且这种模式对Instant Run支持不好;另一个原因是可以更灵活的控制加载或者卸载时机。

    这两种模式的配置是通过配置com.dd.comgradle的Extension来实现的,下面是字节码插入的模式下的配置格式,添加applicatonName的目的是加快定位Application的速度。

    combuild {
        applicatonName = 'com.mrzhang.component.application.AppApplication'
        isRegisterCompoAuto = true
    }

    demo中也给出了通过反射来加载和卸载组件的实例,在APP的首页有两个按钮,一个是加载分享组件,另一个是卸载分享组件,在运行时可以任意的点击按钮从而加载或卸载组件,具体效果大家可以运行demo查看。

    加载和卸载示例.png

    二、组件化拆分的感悟

    在最近两个月的组件化拆分中,终于体会到了做到剥丝抽茧是多么艰难的事情。确定一个方案固然重要,更重要的是克服重重困难坚定的实施下去。在拆分中,组件化方案也不断的微调,到现在终于可以欣慰的说,这个方案是经历过考验的,第一它学习成本比较低,组内同事可以快速的入手,第二它效果明显,得到本来run一次需要8到10分钟时间(不过后面换了顶配mac,速度提升了很多),现在单个组件可以做到1分钟左右。最主要的是代码结构清晰了很多,这位后期的并行开发和插件化奠定了坚实的基础。

    总之,如果你面前也是一个庞大的工程,建议你使用该方案,以最小的代价尽快开始实施组件化。如果你现在负责的是一个开发初期的项目,代码量还不大,那么也建议尽快进行组件化的规划,不要给未来的自己增加徒劳的工作量。

    【最后发个招聘广告:】
    罗辑思维“得到app”发展迅猛,我们急需各路Android和iOS大牛加入,只要你满足下面几点,就是我们所需要的:
    1、热爱移动端开发(android/ios/rn),最好有2到3年的app开发经验
    2、对技术有极致追求,并能踏实的推动技术驱动,致力于实现自己更实现他人
    3、如果你也喜欢知识付费类的产品,有一些自己的产品想法,那更是我们需要的人
    我们的办公地点就在长安街沿线的一座装修精美的独栋里面,环境十分优美。至于待遇,绝对是业内领先的,从我们的内推奖是豪华的苹果三件套就可见一斑。如果你感兴趣,请发送简历到zhangmingqing@luojilab.com

    展开全文
  • 利用CXF发布webService的小demo

    万次阅读 2013-08-05 22:03:14
    其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架。。。 先将相关的jar引进来,在pom文件中添加  org.apache.cxf  cxf-rt-...

    其实webService的发布不仅仅只有xfire,今天,给大家介绍一下用CXF发布一个webService的小demo,CXF也是我做webService用的第一个框架。。。
    先将相关的jar引进来,在pom文件中添加
    <dependency>
          <groupId>org.apache.cxf</groupId>
          <artifactId>cxf-rt-transports-http</artifactId>
          <version>2.7.3</version>
      </dependency>
      
      <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-rt-frontend-jaxws</artifactId>
       <version>2.7.3</version>
      </dependency>
    即可引入相关的
    第一步,不废话,还是写一个简单的接口与实现类,代码如下
    public interface SayCXFService {
    public  String sayHello(String name);
    }
    public class SayCXFServiceImpl implements SayCXFService{
    @Override
    public String sayHello(String name) {
      return name +" hello,this is my first CXF webService!";
    }
    }
    接下来就是重点了,配置文件了,配置文件如下。相应的解释也有
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
    default-lazy-init="true"
    >
      <!-- cxf 相关配置,这个照搬就行了,cxf框架里面自带的配置 -->
    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!-- service定义 -->
    <bean id="sayCXFbean"
      class="com.mip.biz.webservice.cxf.server.service.impl.SayCXFServiceImpl"
      scope="singleton"
    />
    <!--
    serviceClass 表示你要对外开发的接口,address表示的地址,本质就是一个servletName,可以随便命名
       -->
    <jaxws:server id="webService" serviceClass="com.mip.biz.webservice.cxf.server.service.SayCXFService" address="/server">
         <!-- 表示你的接口实现类的bean -->
      <jaxws:serviceBean>
       <ref bean="sayCXFbean"/>
      </jaxws:serviceBean>
    </jaxws:server>
    </beans>

    然后是web.xml文件添加如下内容
    <servlet>
      <description>apache cxf 配置 webservice 服务</description>
      <servlet-name>CXFService</servlet-name>
      <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
      <servlet-name>CXFService</servlet-name>
      <url-pattern>/CXFService/*</url-pattern>
    </servlet-mapping>
    除了测试类,似乎和前段时间的xfire没啥区别,试一下启动tomcat,会发现抱NullPointerException
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webService': Invocation of init method failed; nested exception is java.lang.NullPointerException
    别急,你只需要在接口上稍微改动一下即可

    //注解的方式,将接口注入,targetNamespace中的内容其实就是将包名写反就行了。。这也是我们平时包名的命名规则类似。com开头,然后模块名称..有么像www.ho123.com?
    @WebService(targetNamespace = "
    http://service.server.cxf.webservice.biz.mip.com/")
    public interface SayCXFService {
    public  String sayHello(String name);
    }
    //实现类
    @WebService(endpointInterface="com.mip.biz.webservice.cxf.server.service.SayCXFService",
      targetNamespace = "
    http://service.server.cxf.webservice.biz.mip.com/")
    public class SayCXFServiceImpl implements SayCXFService{
    @Override
    public String sayHello(String name) {
      return name +" hello,this is my first CXF webService!";
    }
    }
    好了重启不会报错了
    然后在浏览器中输入
    http://localhost:8080/mip/CXFService/server?wsdl出现祖国江山一片红的景象就ok了
    - <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.server.cxf.webservice.biz.mip.com/" elementFormDefault="unqualified" targetNamespace="http://service.server.cxf.webservice.biz.mip.com/" version="1.0">
    <xs:element name="sayHello" type="tns:sayHello" />

    <xs:element name="sayHelloResponse" type="tns:sayHelloResponse" />

    - <xs:complexType name="sayHello">
    + <xs:sequence>
    <xs:element minOccurs="0" name="arg0" type="xs:string" />

    </xs:sequence>


    </xs:complexType>


    - 。。。。。。
    注意到上面的红色标记部分没,其实我们可以将参数的名字显示出来,改下接口
    @WebService(targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
    public interface SayCXFService {
    @WebMethod
    @WebResult
    //下面的name="wsdl中暴露出来的接口参数名称"
    public  String sayHello(@WebParam(name="name",targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/") String name);
    }
    重新看下wsdl文件:




    - <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.server.cxf.webservice.biz.mip.com/" elementFormDefault="unqualified" targetNamespace="http://service.server.cxf.webservice.biz.mip.com/" version="1.0">
    <xs:element name="sayHello" type="tns:sayHello" />

    <xs:element name="sayHelloResponse" type="tns:sayHelloResponse" />

    - <xs:complexType name="sayHello">
    - <xs:sequence>
    <xs:element form="qualified" minOccurs="0" name="name" type="xs:string" />

    </xs:sequence>


    </xs:complexType>


    -

    以上是用java开发的服务端,下一章我们接着写客户端与测试类
    @WebService(targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
    public interface SayCXFClient {
    public  String sayHello(String name); }
    客户端其实直接将服务端拷贝过来就可以了。。。。当然这是在java开发的服务端基础上你才可以做,假如你的webservice服务端是其他语言开发的,,,那么可以用其他方法生成客户端咯,主要依据的是wsdl文件。。这个我在下一篇博客给大家介绍。。。请期待
    最后在写个测试类
    public class Test {
    public static void main(String[] args) {
      JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
      factory.setServiceClass(SayCXFClient.class);
      factory.setAddress("http://localhost:8080/mip/CXFService/server");
      SayCXFClient service = (SayCXFClient) factory.create();
           System.out.println(service.sayHello("zhouxy"));
    }
    }
    运行输出
    Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"", local:"arg0"). Expected elements are <{http://service.server.cxf.webservice.biz.mip.com/}name>
    这个是由于我们在服务端明确指出了参数名name照成的,别担心,改下就行了
    @WebService(
    targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/")
    public interface SayCXFClient {
    @WebMethod
    @WebResult
    //下面的name="wsdl中暴露出来的接口参数名称"
    public  String sayHello(@WebParam(name="name",targetNamespace = "http://service.server.cxf.webservice.biz.mip.com/") String name);
    }
    继续运行输出:
    zhouxy hello,this is my first CXF webService!
    ok,demo结束,更详细的理论知识自己查资料去吧

    展开全文
  • 4.重新生成后,发布到指定路径下 5.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 6.输入你自己定义的配置文件名: 7.点击下一步:在发布方法中选“文件系统”,这样我们可以发布到自己指定...
  • vue项目构建-打包-发布--简易demo

    千次阅读 2017-12-06 18:24:51
    vue项目构建 打包发布
  • 首先简单的介绍一下mqtt协议,MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。...2.对负载内容屏蔽的消息传输机制。 3.对传输消息有三种服务质量(QoS):  最多一次,这一级别会发生消息丢失或重复,...
  • springboot-emqttv3-demo
  • PluginDemo.zip

    2019-09-23 09:11:45
    PluginDemo.zip,创建项目和插件, 完善插件内容和配置, 打包发布并且正确引用自定义插件
  • eddystone-chrome-apps-demo Chrome应用程式会根据图片发布不同的网址。 使用提供的Eddystone广告库。 BLE广告可用性 BLE广告仅在Single App Kiosk模式下可用。 为了进行开发,您应该在chrome://flags/#enable-ble...
  • springboot-emqtt-demo客户端使用org.fusesource.mqtt-client,没有org.eclipse.paho.client.mqttv3客户端稳定
  • Lucene-4.0.0的demo编译、发布和使用

    千次阅读 2013-03-12 11:03:28
    最简单的方式莫过于基于Lucene开发,再结合Solr的文件格式分析,就可以实现一个检索doc,docx,PDF,email等文件内容和Metadata的便利工具,方便我查找文档。 1. 下载Lucene源代码 在...
  • 我在学习这个Spring cloud stream时,也是学习着别人的博客,跟着别人的博客搭着Demo,一步步了解这个玩意,但是,作为博客博主,总会漏掉一些博主想当然的东西,觉得不需要赘述的东西,这恰恰是初学者为何有时跟着...
  • JBPM进阶篇 一: 发布并改进JBPM demo websale 工作流 在前面一篇文章 在Tomcat和Mysql下部署JBPM 3.2.2 中 我们讨论了如何在tomcat和mysql中部署JBPM web-console环境,但是当我们使用... 在这一篇文章中我们就
  • 1月9日,向乔布斯致敬的张小龙如约发布了微信小程序,首批上线的小程序就有300多家,一时刷爆朋友圈,如果不转发一两条有关小程序的内容,你都不好意思自称挨踢人。从效率看,小程序成功给APP瘦身,节省了系统资源。...
  • 这是一个基于Maven的Spring + Spring MVC + MyBatis + MySQL整合SSM框架的学习demo开发环境:IntelliJ IDEA Java IDE JDK:1.7 Spring版本:3.2.0.RELEASE 2017-03-09 更新了所有依赖版本,添加activeMQ,整合cxf ...
  • 详细内容见我的BLOG文章: blog.csdn.net/alamiye010/archive/2010/05/07/5568581.aspx
  • 阿里百川 OpenIM Demo

    2016-01-06 10:08:23
    1、如果您单纯是想体验OpenIM的功能,建议直接跳过这一步,直接查看...4、您需要在完成快速集成后,将一些内容替换为您申请到的特定内容,才能发布您的App。对于这些需要替换的内容,会在教程中以注意点的形式标识出。
  • 第一步,发布挑战: :::tip 描述挑战的内容,即要实现的效果 ::: 效果 第二步,基于 vuepress 的 Component 生成的例子。在 .vuepress/component 目录下。 接着一般会给出 css 揭秘官方 DEMO 思路 第四步,根据例子...
  • 在项目主目录下运行:npm publish时,注意事项: ... 在项目主目录下运行:npm publish ...//退出当前文件夹,开始命令行发布包,命令如下: npm publish testxxxxx 其实,在项目主目录下运行:npm publish 即可。
  • backbonejs-demo-源码

    2021-05-04 12:32:51
    特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发,再许可和/或出售本软件的副本,并允许具备软件的人员这样做,但须...
  • webservice-service-demo.rar

    2020-02-18 11:36:23
    springboot2.0集成webservice服务,包括发布内容以及一些简单的注解。一个小的demo,亲测运行
  • 演示扩展示例 ...主要内容 扩展的主要信息展示 扩展的加载方式 开源协议 本扩展共识Apache2开放协议发布,在保留本扩展版权的情况下提供个人及商业免费使用。 版权 该系统所属版权归deatil( )所有。
  • Elasticsearch 的使用Demo

    千次阅读 2019-03-06 11:30:26
    Elasticsearch 的使用Demo ** Elasticsearch项目地址: https://github.com/looly/elasticsearch-definitive-guide-cn http://git.oschina.net/loolly/elasticsearch-definitive-guide-cn 1. 安装Elasticsearch 唯一...
  • 移动开发经典Demo

    2015-08-17 16:38:06
    自动更新(Update SDK) 快速集成 只需添加一行代码即可集成自动更新组件。开发者在需要发布新版本时,在后台上传最新的安装包、填写更新内容,旧版本的用户即可收到升级提示。
  • 下面就用云开发做一个类似QQ发布动态的demo吧! 该博客解决的问题: 云开发上传多张图片 上传内容 对回车键进行转换 显示回车 图片预览 demo 先上效果图(图一:发布界面 图二:动态界面) 代码详解 步...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,181
精华内容 36,072
关键字:

内容发布demo