Spring对WebSocket的支持
Spring 4.x引入了新的模块spring-websocket,对WebSocket提供了全面的支持,Spring的WebSocket实现遵循JSR-356(Java WebSocket API),并且添加了一些额外特性。
绝大部分现代浏览器均支持WebSocket,包括…
阅读全文基于Kurento搭建WebRTC服务器
Kurento是一个WebRTC媒体服务器,同时提供了一系列的客户端API,可以简化供浏览器、移动平台使用的视频类应用程序的开发。Kurento支持:
- 群组通信(group communications)
- 媒体流的转码(transcoding)、录制(re…
Apache Curator学习笔记
Apache Curator(音标[kjʊ(ə)'reɪtə])Framework是ZooKeeper的Keeper(动物园管理员的管理员)。它是一个Java库,提供了比ZooKeeper更加高层的API,更加易用、可靠。Curator的推荐的ZooK…
阅读全文AsyncHttpClient知识集锦
本文所指的AsyncHttpClient是指基于Netty的一个开源项目,该项目基于Java8编写,用于简化HTTP客户端的开发。该项目还支持WebSocket协议。
要使用该AsyncHttpClient,引入以下Maven依赖:
1 2 3 4 5 |
<dependency> <groupId>org.asynchttpclient</groupId> <artifactId>async-http-client</artifactId> <version>LATEST_VERSION</version> </dependency> |
1 2 3 4 5 6 7 8 |
AsyncHttpClientConfig cf = new DefaultAsyncHttpClientConfig .Builder() // 设置代理服务器 .setProxyServer(new ProxyServer.Builder("127.0.0.1", 8087)) .build(); // 为客户端提供配置项 AsyncHttpClient http = new DefaultAsyncHttpClient(cf); |
ListenableFuture是java.util.concurrent.Future的子类型,你可以使用Java8并发框架…
阅读全文ZooKeeper学习笔记
ZooKeeper是Hadoop的子项目,实现高可靠的分布式协调服务。它可以提供分布式的配置、同步、命名、集群服务。ZooKeeper暴露了一系列简单的接口,具有Java、C语言绑定。
为了正确构建复杂的服务,ZooKeeper提供以下保证:
- 顺序一致…
Socket.io学习笔记
Socket.io是一个Web通信框架框架,同时支持基于浏览器环境的客户端、基于Node.js的服务器端。它实现了实时的、事件驱动的双向通信。使用Socket.io,你可以:
- 推送数据,让客户端展示实时更新的仪表/图表、文本信息
- 推送二进制流,从1.0版本…
IntelliJ IDEA知识集锦
IDEA是一个历史悠久的Java集成开发环境,它始于2001年,以智能化著称。IDEA基于IntelliJ平台,分为社区版、商业版。IDEA目前自带JRE,此JRE仅仅用于IDEA的运行,不能做开发用。
在IDEA中,你总是…
阅读全文ProGuard学习笔记
ProGuard是一个开源的Java类文件(.class)处理工具,相比起其它的Java混淆器,ProGuard更快,更易用。它同时提供了命令行和图形界面。ProGuard能够:
- 压缩(Shrunk ):检测未使用的类、字段、方法、属性,…
snmp4j学习笔记
snmp4j是Java社区首选的SNMP协议的开源实现,支持JDK1.4+版本,该框架受C++库snmp++启发,以面向对象的方式进行设计。snmp4j同时支持Manager、Agent两种角色,支持同步、异步通信方式,以及多种验证方式和加密算法。snmp…
阅读全文基于Spring Test和Mockito进行单元测试
本文引入一个简单的银行业务场景,用来阐述如何集成Spring Test、Junit、Mockito,以简化单元测试工作。该场景主要的业务代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/** * 人员 */ public class Person { private int id; private String name; private Account defaultAccount; } /** * 账户 */ public class Account { private int id; private int balance; private Person person; } /** * 人员服务接口 * */ public interface PersonService { /** * 查询人员用户 */ Person getPerson( int id ); /** * 得到人员默认账户 */ Account getDefaultAccount( Person p ); } /** * 账户服务接口 * */ public interface AccountService { /** * 查询人员默认账户余额 */ int queryBalanceOfDefaultAccount( int personId ); } |
假设你已经实现了服务AccountService:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@Service ( "accountService" ) public class AccountServiceImpl implements AccountService { private Map<Integer, Object[]> accountDatabase; @Inject private PersonService personService; @PostConstruct public void init() { accountDatabase = new HashMap<Integer, Object[]>(); //字段:账号,余额 accountDatabase.put( 100, new Object[] { "6225100", 68861 } ); accountDatabase.put( 101, new Object[] { "6225101", 1851 } ); accountDatabase.put( 102, new Object[] { "6225102", 845 } ); accountDatabase.put( 103, new Object[] { "6225103", 16598 } ); } @Override public int queryBalanceOfDefaultAccount( int personId ) { Person person = personService.getPerson( personId ); Account defaultAccount = person.getDefaultAccount(); return (Integer) accountDatabase.get( defaultAccount.getId() )[1]; } } |
而你的搭档负责的PersonService还没有开发完毕,如何方便的进行单元测试呢?
你可能会觉得,我们不需要在单元测试中引入Spring。对于上面的例子的确可以这么说,它太简单了,AccountServiceImpl 依赖的PersonService完全可以通过setter手工注入。但是实际的开发场景要比这个例子复杂的多,待测试类可能和S…
阅读全文