J2EE平台可以提供很多独立于业务逻辑的操作:
- 在应用程序代码库之外处理数据库连接
- 在需要的时候启动池功能
- 以声明的方式执行事务管理
- 使用一个可随时使用的事务管理基础结构
- 在应用程序中安装并装配组件
- 在系统上应用安全约束
- 处理线程和调度问题
控制反转
IOC被认为是任何容器都需要提供的基本功能之一,他有两种形式:依赖查找和依赖注入。
在依赖查找中,容器向其管理的组件提供了回调方法,而组件则通过这些回调方法与容器进行交互并显式地获取他们的依赖项。这种情况下,通常用一个查找上下文(JNDI)来访问依赖组件以及容器管理的其他资源。
在依赖注入中,组件提供了合适的构造函数或Setter方法,以便容器可以注入依赖组件。一般来讲,很少在组件内执行显示依赖查找,大多数情况下,是通过构造函数或Setter方法在创建组件的时候注入依赖项。
依赖注入
依赖注入的基本原则是:应用程序对象不应该负责查找他们所依赖的资源或协作者,而是应该有IOC容器处理创建和依赖注入,从而导致资源查找的外部化,从应用程序代码转移到容器。
依赖注入可以在系统中带来很多好处:
- 可从应用程序代码中完全删除查找逻辑代码,依赖项可以以一种可插拔的方式注入目标组件中,这样组件就不需要知道依赖项的位置或类。
- 对容器的API也没有任何依赖,可以将代码从一个容器中移植到另一个容器中,并且不需要进行任何修改就可以进行。
- 完全不需要实现任何特殊的接口。
有两种依赖注入的方式:
Setter注入
当一个对象被容器实例化之后就会马上调用Setter方法,该注入在组件的创建或初始化阶段发生,并且在处理业务方法调用之前完成。
Setter注入最重要的优点就是组建创建后可以进行重新配置,组件的依赖项可以在运行时更改。
Setter注入最重要的缺点就是并不是所有所需依赖项都可以在使用前被注入,从而使组件处于一种部分配置状态。
构造函数注入
通过构造函数注入,Bean可以利用构造函数参数来表达依赖项,这样就可以在组件创建期间注入依赖项,同时,出于线程安全的考虑,也需要使用构造函数注入。
构造函数注入的最大优点:可以保证容器中每一个被管理的组件都处于一致状态,并且在创建之后可以被马上使用;使用构造函数注入所编写的代码量要比使用Setter注入所编写的代码量少一些。
构造函数注入的最大缺点:组件创建完成后就再也无法对组件从新配置,除非提供Setter作为构造函数参数。