当发生类似 Bean#1 -> Bean#2 -> Bean#1 的依赖时,Spring框架通常能够自动的进行处理

You can generally trust Spring to do the right thing. It detects configuration problems, such as references to non-existent beans and circular dependencies, at container load-time. Spring sets properties and resolves dependencies as late as possible, when the bean is actually created.

阅读更多

Nutch爬虫开发

介绍

Nutch是一个用Java实现的搜索引擎,它包括全文搜索和网络爬虫。它支持针对不同的业务场景,使用本地运行模式或者基于Hadoop的分布式运行模式。

Nutch目前主要由1.x和2.x两个分支,主要的不同在于数据存储的实现。这里的存储指的是,Nutch本身会保存关于爬取过程中的爬虫的各种状态到称为crawldb的存储中去。1.x是以SequenceFile结构的方式保存到本地或者分布式文件系统中去,而2.x则是把存储层抽象了出来,不再依赖特定的存储结构,而是使用gora来处理存储映射,所以最终可以保存到gora支持的RDBMS、NOSQL(Mongodb、HBase)等各种存储中去。

阅读更多

后台长时间任务的监控,例如,处理进度的监控,可以通过客户端轮询拉或者服务器推技术来实现。这里主要讨论服务器推技术的实现。

Comet

基于HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。Comet主要有两种实现方式。

基于 AJAX 的长轮询(long-polling)方式

使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于

  1. 服务器端会阻塞请求直到有数据传递或超时才返回。
  2. 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
  3. 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

阅读更多

JSR223

Java中调用其他脚本语言可以通过JSR223来实现。JSR223规范定义了脚本调用的抽象,只要拥有对应脚本的JSR223的实现,即可实现Java对对应脚本的调用。

例如,下面是对JS脚本的调用

1
2
3
4
5
6
7
8
import javax.script.*;
public class HelloWorld {
public static void main(String[] args) throws ScriptException {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
engine.eval("print ('Hello World')");
}
}

阅读更多

Spring Test

Spring Test框架提供的MockMvc可用于实现Controller的集成测试。

例如

1
2
3
4
5
6
7
MockHttpServletRequestBuilder createMessage = post("/messages/")
.param("summary", "Spring Rocks")
.param("text", "In case you didn't know, Spring Rocks!");
mockMvc.perform(createMessage)
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/messages/123"));

阅读更多

基本概念

单元测试

一些单元测试中设计的基本概念

  • Stub 指的是以可控的方式对对象方法进行模拟,使其按照预期的行为返回结果或抛出异常等的过程。
  • Mock Object 整个对象都是模拟对象,所有方法在模拟之前进行调用都是空方法。
  • Spy Object 对真实对象的部分方法进行模拟,除了模拟的方法外调用的都是真实的方法。

阅读更多

概念

首先,HATEOAS (Hypermedia as the Engine of Application State) 是REST应用架构的一个约束。一个hypermedia-driven的站点通过响应中的超媒体链接动态地提供了导航到站点的REST接口的信息。

下面是一个基于HATEOAS的响应

1
2
3
4
5
6
7
{
"name": "Alice",
"links": [ {
"rel": "self",
"href": "http://localhost:8080/customer/1"
} ]
}

阅读更多

Fork me on GitHub