原文:http://en.wikipedia.org/wiki/Plain_Old_Java_Object
POJO means Plain Old Java Object. The name is used to emphasize that a given object is an ordinary Java Object, not a special object.
The term "POJO" is mainly used to denote a Java object which does not follow any of the major Java object models, conventions, or frameworks
理论上,a POJO需要符合的条件是:
1,不能继承任何父类。
2,不能实现任何接口。
3,不能使用任何annotation (这点有些框架并没有遵守)
javabean就是POJO的一个例子。一个理想的bean:
public class MyBean {
private String someProperty;
public String getSomeProperty() {
return someProperty;
}
public void setSomeProperty(String someProperty) {
this.someProperty = someProperty;
}
}
如代码所示,没有参数化的构造函数,允许通过get/set方法使用成员变量。同时使用了简单的命名规范(getSomeProperty/setSomeProperty)。这种命名方式可以适用于任何javabean。
代码在和使用这种命名方式的对象打交道时,甚至不需要知道bean的类型。同时bean也可以被任何框架使用,而不用受限于任何特定的框架或工具。这是使用POJO最大的好处。
其实使用POJO提高了可测试性。因为对象不基本任何框架,因此可以方便的独立测试,而不需要和框架一起测。
Spring 是一个较早实现了这个想法的框架。其他的例子是:
- Enterprise JavaBeans,
- JPA (including Hibernate) --指java persistence api
- CDI
下面的例子展示了一个完整的EJB bean,显示了EJB3是如何遵循POJO 模型的。
public class HelloWorldService {
public String sayHello() {
return "Hello, world!";
}
}
如代码所示,这个bean不需要继承任何EJB类,或是实现任何EJB接口,或是EJB的annotation。取而代之的是,程序员使用一个外部的xml文件来表明哪些EJB services应该被添加到bean里:
<enterprise-beans>
<session>
<ejb-name>helloWorld</ejb-name>
<ejb-class>com.example.HelloWorldService</ejb-class>
<session-type>stateless</session-type>
</session>
</enterprise-beans>
在现实生活中,一些人认为使用annotation更优雅,因为xml显得有些冗余,不好看而且不好维护。但是其他一些人认为annotation并不符合POJO模型。
因此,很多框架(Spring, EJB, JPA) 同时允许使用annotation和xml。
@Stateless
public class HelloWorldService {
public String sayHello() {
return "Hello, world!";
}
}
如上使用了annotation,使得这个bean不再是纯粹的POJO了。但是使用annotation比起使用继承父类/接口,缺点还是少很多的。因此认为这样还是基本符合POJO模型的。