POJO
定义
即Plain Old Java Object, 指没有使用Entity Bean的普通Java对象,不实现任何其他Java框架(如EJB,JDBC等等)的接口的类或者接口。其中典型的一部分是含有一些私有参数作为属性并为每个参数定义了getter和setter方法来修改值的数据类。如
public class User {
private long id;
private String name;
public void setId(long id) {
this. id = id;
}
public void setName(String name) {
this. name=name;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
}
上例中定义的User类包含了long id, String name两个private属性,他们各定义了getter和setter方法
优势——相对EJB
编写快速简单,不需要创建任何不使用的回调方法
EJB组件接口和业务逻辑实现类都必须从EJB框架包中扩展接口,EJB 2.x需要实现几个不必要的回调方法
由于所编写的类不需要依赖特定API,也不需要实现特定接口或者扩展特定框架,因此容易通过网络传输并在不同层之间使用,而不需要创建单独的数据传输对象类。
一个EJB组件至少需要针对主程序、远程接口和业务对象实现三个不同的类
可以通过JUnit轻松地完成测试而不用使用容器内测试框架
EJB中的本地和远程接口使Session Bean之间产生依赖关系,从而不能在独立环境测试Session Bean而需要Cactus之类的容器内框架,相比JUnit更复杂且更缓慢
轻量级容器和控制反转
容器
组件装配和中间件服务提供,希望实现功能:
- 生命周期管理
- 依赖解析
- 组件查找
- 应用程序配置
加分项:
- 事务管理
- 安全性
- 线程管理
- 对象和资源池
- 对组件的远程访问
- 通过JMX之类的API管理组件
- 容器的扩展和定制
轻量级含义
不需要为了依赖这些API编写代码(非侵入性),启动快,不需要部署到功能齐全的Java EE应用程序服务器上就可以提供上述服务
控制反转/依赖注入(IoC/DI)
对依赖项的控制由组件转移到容器,接口的具体实现包含在容器的配置文件中而不是混杂在业务代码中,使得管理和修改变得方便
setter注入
优点:创建之后可以重新配置
缺点:并不是所有依赖项都可以在使用前被注入,使组件处于部分配置状态,且有时setter方法调用顺序很重要,一些顺序可能无法在组件约定中表达构造函数注入
优点:创建期间注入依赖项,线程安全
缺点:无法重新配置setter+构造函数