spring入门经典——pojo编程模型、轻量级容器和控制反转

一、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库不同部分之间的交互

spring入门经典——pojo编程模型、轻量级容器和控制反转_第1张图片

(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、哪些依赖注入可以处理“循环依赖”,哪些不可以。


你可能感兴趣的:(spring入门)