一、pojo编程模型
1、pojo:简单的java对象(plain old java objects)。旨在简化java应用程序(特别是企业级)的编码、测试以及部署等阶段。
2、ejb编程模型存在的问题。
(1)它提供了一种与运行时平台相结合的分布式业务组建模型,运行时该平台提供了执行ejb组件所需要的所有中间件服务。
(2)可测试性艰难。jndi查找是依赖注入的早期形式,但由于其拉式性质,使得在单元测试期间使对组件隔离变得非常困难(因为对jndi上下文的依赖)。
(3)部署耗时且易于出错。
(4)ejb编程模型趋向于将开发人员的风格转向面向过程程序设计风格。
3、pojo编程模型的优点
(1)、编写应用程序类非常快速和简单。因为编写的类不需要依赖任何特定的API,不需要视线任何特定的接口或扩展自某一特定的框架类。
(2)、以面向对象的方式来变成,精细模型处理业务逻辑,可以让行为处理更加丰富。
二、轻量级容器和控制反转
1、J2EE环境提供了运行应用程序所需的中间服务件。下列操作独立于业务逻辑,可以由J2EE提供。
①在应用程序代码库之外处理数据库连接。
②在需要的时候启动池功能。
③以声明的方式执行事务管理。
④使用一个随时可以使用的事务管理基础结构。
⑤在应用程序中创建并装配组件。
⑥在系统上应用安全约束。
⑦处理线程和调度问题。
2、轻量级容器
(1)容器(container):在该环境中,所有组件都被创建和装配,并提供了所需的中间件服务。
(2)java ee平台提供了多个这样的容器,每一个专门容器为应用程序的一个特定层提供服务。
(3)spring container也是一个容器,在这个里面,应用程序被装配,彼此创建,并以一种轻量级的方式提供中间件服务。
(4)容器可以向环境提供所被预期的服务:
①生命周期管理
②依赖解析
③组件查找
④应用程序配置
其余更优预期的服务:事务管理、安全性、线程管理、对象和资源池、对组件的远程访问、通过jmx之类的API管理组件、容器的扩展和定制。
(5)一个轻量级的容器(lightweight container)包含上述所有功能,同时不依赖这些API编写应用程序代码。轻量级容器没有入侵性,启动非常快,不需要将其部署到一个功能齐全的java ee应用程序服务器上就可以使用这些服务。
(5)spring application framework是最著名的轻量级容器之一。
3、控制反转
(1)容器及其管理的组件所提供的最重要的好处是可插拔的体系结构。
(2)组件实现接口,用来访问其他组件提供的服务。
(3)容器创建组件及所依赖的服务,并将之装配在一起。
(4)组件类中,在运行时由容器实例将依赖组件注入组件。
对依赖项的控制由组件转到容器,这种模式就成为反转控制inversion of controll,简称IOC。
4、IOC是容器的基本功能之一,主要有两种形式:
(1)依赖查找(dependence lookup)
在依赖查找中,容器向管理组件提供的回调方法,被组件用来与容器进行交互并显式的获取它们的依赖项。
这种情况下,通常使用一个查找上下文来访问依赖及容器管理的资源。
(2)依赖注入(dependence injection)
在依赖注入中,组件提供了合适构造函数和setter方法,以便容器可以注入依赖组件。
(3)J2EE环境中,通过查找上下文即JNDI上下文,访问EJB组件及其他资源,如JDBCDataSource和JMS ConnectionFactory。
例如:J2EE平台中,通过JDNI API实现JDNI库不同部分之间的交互
(4)随着spring application framework 和其他轻量级IOC框架出现,容器根据自己的配置机制来确定组件实例化和需要的依赖组件。
(5)J2EE向java ee演化的过程中,使用JDNI进行的显式依赖查找被逐步转变为隐式依赖注入方法。
三、依赖注入
1、基本原则:应用程序对象不应该负责查找它们所依赖的资源或者协作者,而是由IOC容器处理对象创建和依赖注入,从而导致资源查找外部化,从应用程序代码转移到容器。
2、给系统带来的好处:
(1)完全删除应用程序中的查找逻辑代码,依赖项以可插拔的方式注入到目标组件中。
(2)组件不需要知道依赖项的位置或类,很容易进行组件的单元测试。
(3)对容器API没有任何的依赖。
(4)不需要实现任何特殊接口。
3、两种依赖注入方法
(1)构造函数注入
(2)setter注入
一个好的容器可以同时支持这两个种方法,并允许混合使用。
4、setter注入
(1)当一个对象被实例化之后就会马上调用setter方法。
①该注入在组件的创建和初始化阶段发生,并且在处理业务方法调用之前完成。
②setter方法是javabean规范的一部分。
③使用javabean属性使简单属性外部化。
(2)优点:组件在创建之后可以进行重新配置。
①组件依赖可以在运行时更改。
②现有的类提供了getter和setter方法来访问它们的属性。
(3)缺点:并不是所有的依赖项都可以在使用前被注入,从而使组件处于一种部分配置状态。
5、构造函数注入
(1)bean可以利用构造函数参数来表达依赖项,这样就可以在组件创建期间注入依赖项。
(2)出于线程安全的考虑,也需要使用构造函数注入。
(3)可以像注入构造函数参数那样注入简单的属性。
(4)优点
①保证容器中每一个被管理的组件都处于一致的状态,并在创建之后可立刻使用。
②编写的代码量比setter注入编写的代码量要少一些。
(5)缺点
①在组件创建完毕后就无法再对组件进行重新分配。除非为相关属性提供一个setter作为构造函数参数。
②具体继承可能有问题。
四、小结与问题
1、研究一下容器内可用的测试框架,对比容器外测试,有哪些优缺点。
2、新的EJB模型使用了IOC的哪些方法。
3、哪些依赖注入可以处理“循环依赖”,哪些不可以。