j2ee项目实训spring框架技术——第6章aop和springaop技术第2部分内容摘要:

的目标,一般采用 GOF 设计 模式中的代理模式来编程实现。 下面通过一个在某系统中的业务层组件实现日志记录的功能为例,说明代理模式和 AOP 技术在实现上的不同。 常规的 日志记录的实现方法 杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究 , 8/16 页 ( 1) 某系统的用户信息管理的业务层组件的接口 UserManagerInterface 的定义 【例 66】 UserManagerInterface 接口 的定义 示例 package。 public interface UserManageInterface{ public boolean doUserLogin(String userName, String userPassWord)。 public boolean doUserLogout(String userName)。 } ( 2)为 接口 UserManagerInterface 提供一个实现类 UserManageImplement 【例 67】 实现类 UserManageImplement 的代码示例 package。 import .*。 public class UserManageImplement implements UserManageInterface { private Logger logger = (().getName())。 public UserManageImplement() { } public boolean doUserLogin(String userName, String userPassWord){ (, doUserLogin 方法开始执行 ....)。 (userName= + userName +正在登录系统 !)。 //代表业务实现 (, doUserLogin 方法已经结束 ....)。 return true。 } public boolean doUserLogout(String userName){ (, doUserLogout 方法开始执行 ....)。 (userName= + userName + 正在注销 !)。 //代表业务实现 (, doUserLogout 方法已经结束 ....)。 return true。 } } 在该实现类中的两个业务方法中实现 日 志记录的功能, 本示例为了简化之目的,没有杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究 , 9/16 页 将具体的业务功能的实现代码附录出,而以打印输出信息作为代表。 常规的 日志记录的实现方法 的 缺点 ( 1)没有遵守 面向对象设计中的 “单一职责”的原则 在 常规的实现方法 中, 使得 Logger 日志记录的功能 的实现直接 介入到了 业务功能实现类 UserManageImplement 中,而日志这个功能 应该 不属于 业务功能实现类UserManageImplement 所 必须 应该考虑实现的 (或者说本不属于它应该承担的职责) ,这将 使得 UserManageImplement 类 的职责 成为双 重职责 ,这是 与 面向对象设计中的 “单一职责”的原则 不 相 吻合。 ( 2) 实现 日志记录的功能 代码重复 地 遍布在 各个方法中 在本示例中目前还只是两个业务方法 ,如果在整个应用 系统 的各个模块中都需要 应用日志这个功能,那将会使日志功能代码遍布在应用 系统 的各个模块中。 解决 此问题 的基本思路 将主应用功能模块( 也就是前面所描述的 核心关注点 , 在 本示例中 为业务功能类UserManageImplement)和日志功能( 也就是前面所描述的 横切关注点)相互分离。 可以采用代理模式和 Spring AOP 技术来解决此问题 ( 1)方法 之 一是采用静态代理技术 所谓的静态代理类是由开发者编程创建或由特定工具自动生成源代码,然后再对其编译。 在程序运行前,该代理类的 .class 文件就已经存在了。 采用静态代理技术时,开发者可以以下面的两种方式来具体实现。 1) 针对每个具体类分别编写代理类; 2) 针对一个接口编写一个代理类; ( 2)方法二是采用动态代理技术 所谓的动态代理类是指在程序运行时,运用反射机制动态创建出。 但该动态代理类需要实现 InvocationHandler 接口,然后借用 JDK 反射包中的 Proxy 类为各种接口动态生成杨教授工作室 精心创作的优秀程序员 职业提升必读系列资料 杨教授工作室,版权所有,盗版必究 , 10/16 页 相应的代理类。 ( 3)方法三是采用 Spring 框架中的 AOP 技术,但使用 Around 类型的 Advice 来具体实现。 采用静态代理技术 的具体实现示例 ( 1) 修改 前面的 【例 67】中的 UserManagerInterface 接口 的实现类 为下面的 【例 68】中所示的 代码 【例 68】 对 UserManageImplement 类进行 修改 后的结果示例 package。 public class UserManageImplement implements UserManageInterface{ public boolean doUserLogin(String userName, String userPassWord) { (userName= + userName +正在登录系统 !)。 return true。 } public boolean doUserLogout(String userName) { (userName= + userName +正在注销 !)。 return true。 } } 因此,应用 代理模式后,原来的业务功能类将不再包含有其它横切关注点的功能实现代码,因此分离了两者 各自的功能实现。 ( 2)为该实现类 UserManageImplement 提供一个代理类 在 代理 模式 中 主要包括代理对象 本身 和被代理对象 ,它们要实现相同的接口。 根据代理模式的实现规则,开发者在该代理类中实现日志功能(。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。