`
zyl
  • 浏览: 486735 次
社区版块
存档分类
最新评论

使用aop创建松散耦合(分析日志程序)

    博客分类:
  • AOP
阅读更多
       日志,是每个系统都不可缺少的。但是,又不是必要的业务需求。
        但用于日志记录的代码和主要用于其它职责的代码缠绕在一起。根据所解决的问题的复杂程度和作用域的不同,所引起的混乱可大可小。更改一个应用程序的日志记录策略可能涉及数百次编辑 ― 即使可行,这是个令人头疼的任务。
         考虑一下以下代码:
清单 1. 日志调用手工插入到每个方法中        
public void doGet(JspImplicitObjects theObjects) throws ServletException{  logger.entry("doGet(...)");  JspTestController controller = new JspTestController();  controller.handleRequest(theObjects);  logger.exit("doGet");}
        可能在不同的方法中都存在这样的代码。这就造成代码的无限扩张,同时修改也变得非常困难。
       使用aop后,更改的代码为:
清单 2. 自动应用于每个方法的记录日志调用
public aspect AutoLog{    pointcut publicMethods() : execution(public * org.apache.cactus..*(..));  pointcut logObjectCalls() :    execution(* Logger.*(..));      pointcut loggableCalls() : publicMethods() && ! logObjectCalls();      before() : loggableCalls(){    Logger.entry(thisJoinPoint.getSignature().toString());  }      after() : loggableCalls(){    Logger.exit(thisJoinPoint.getSignature().toString());  }}
所有的日志维护都集中于AutoLog方面。

Pointcut 和 join point

要理解 Pointcut,必需知道 join point 是什么。join point 表示在程序执行中明确定义的点。AspectJ 中典型的 join point 包括方法调用、对类成员的访问以及异常处理程序块的执行。join point 可以包含其它 join point。例如,一个方法调用可能在它返回之前引起其它方法调用。那么,Pointcut 就是一种语言构造,这种构造根据已定义的标准挑选一组 join point。示例中的第一个 Pointcut 称为 publicMethods ,选择 org.apache.cactus 包中的所有公用(public)方法的执行。 execution 是一个原始的 Pointcut(就象 int 是一种原始的 Java 类型)。它选择与其括号中定义的方法说明匹配的任何方法的执行。方法说明允许包含通配符;示例中的一个方法说明包含了几个通配符。第二个名为 logObjectCalls 的 Pointcut 选择了 Logger 类中的所有方法的执行。第三个 Pointcut loggableCalls ,通过使用 && ! 合并了前两个 Pointcut,这意味着它选择了除 Logger 类中的公用方法以外, org.apache.cactus 中所有的公用方法。(记录 log 方法将导致无限递归。)

Advice

既然 Aspect 已经定义了它应该记录的点,它使用 Advice 来完成实际的日志记录。Advice 是在 join point 之前、之后或周围执行的代码。相对于 Pointcut 来定义 Advice,说类似于“在想要记录的每个方法调用之后运行这些代码”这样的话。因此 Advice 如下:

 

before() : loggableCalls(){    Logger.entry(thisJoinPoint.getSignature().toString());}

Advice 使用 Logger 类,其入口和出口方法类似于下列代码:

 

public static void entry(String message){   System.out.println("entering method " + message);}

在示例中,传递到记录器的 String 是从 thisJoinPoint 派生的,这是一个特殊的反射对象,它允许访问 join point 执行所处的运行时上下文。在 Cactus 实际使用的 Aspect 中,Advice 使用这种对象来检索传递到每个记录的方法调用中的方法参数。当日志记录 Aspect 应用于代码时,方法调用的结果如下:


清单 3. AutoLog Aspect 的输出

entering method: void test.Logging.main(String[])entering method: void test.Logging.foo()exiting method: void test.Logging.foo()exiting method: void test.Logging.main(String[])

 

分享到:
评论

相关推荐

    AOP 解决紧密耦合的难题

    这种方法对于构建松散耦合、可扩展的企业级系统特别有用。 在实际应用中,静态横切可以用来处理常见的企业挑战,如在利用第三方代码的同时保持应用程序的灵活性。创建静态横切不需要切入点和通知,而是直接在对象中...

    AOP开发实践

    #### 二、使用AOP实现松散耦合 传统的面向对象编程(OOP)中,对象之间的交互往往是直接的,这导致代码间存在着较高的耦合度。AOP通过提供一种将这些非业务逻辑行为从主流程中分离出来的机制,实现了更为灵活的设计...

    Unity结合三导实现依赖注入跟AOP

    总结,Unity结合AOP的使用,可以帮助我们构建松散耦合、易于测试和维护的代码。通过依赖注入,我们可以管理对象的生命周期,减少硬编码依赖;而AOP则让我们能够更优雅地处理横切关注点,保持代码的整洁。在实际项目...

    AOP开发实践.docx

    面向方面编程(AOP)是一种编程范式,旨在提高软件系统的模块化程度,通过将关注点分离,特别是将“横切关注点”(如日志、安全性、事务管理等)与核心业务逻辑相分离,实现更清晰、更松散耦合的代码。在Java中,AOP...

    springAop的配置实现

    了解和掌握Spring AOP的配置实现,有助于提升我们构建松散耦合、易于维护的系统的能力。在实际项目中,我们可以根据需求选择合适的代理类型,并结合XML配置实现面向切面编程,提高代码的可读性和可维护性。

    利用SPring AOP配置切面的一个例子

    通过这种方式,我们将这些行为抽象为独立的模块——切面,从而实现代码的松散耦合。 #### 步骤一:定义业务类`DukePerformer` 首先,我们定义了`DukePerformer`类,实现了`Performer`接口,其中包含了一个`perform...

    java aop、ioc 、注解 实例 Demo

    总的来说,这个Demo实例将涵盖如何在Java项目中利用AOP、IOC和注解来实现灵活、松散耦合的代码结构。通过学习和实践这个Demo,开发者可以更好地理解和掌握Spring框架的核心特性,从而提高开发效率和代码质量。

    sqring aop 必须的四个jar包

    Spring AOP,即Spring的面向切面编程模块,是Spring框架的重要组成部分,它允许开发者在不修改源代码的情况下,对程序...同时,Spring AOP与Spring IoC(依赖注入)相结合,可以构建出松散耦合、高度模块化的应用系统。

    spring

    Spring AOP(面向方面编程)是Spring框架的一个核心组件,它提供了一种优雅的方式来处理横切关注点,如事务管理、日志记录、性能监控等,从而实现代码的松散耦合。这种编程模式允许我们将关注点与业务逻辑分离,提高...

    spring MVC + JDBC(包括触发器,AOP等)

    Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、模块化且松散耦合的Web应用程序。它基于Spring框架,提供了模型-视图-控制器(MVC)架构模式,使得开发者可以更专注于业务逻辑,而不是底层的HTTP处理。...

    spring aop 原理解析

    【Spring AOP 原理解析】 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许开发者定义“切面”来封装系统中的...通过理解和熟练使用Spring AOP,开发者可以更好地构建松散耦合、高度模块化的应用程序。

    SpringIOC和AOP实现机制模拟

    在实际项目中,结合使用Spring的IOC和AOP,我们可以构建出松散耦合、易于扩展的应用系统。例如,通过AOP处理日志记录,可以确保每个方法调用前后都有相应的日志输出,而无需在每个方法内部添加日志代码,大大提高了...

    Spring4--2.bean注解和AOP

    在Spring 4中,Bean注解和AOP结合使用,可以构建出松散耦合、易于维护的系统。通过注解配置,我们可以快速地声明和管理Bean,而AOP则帮助我们处理那些贯穿多个类的通用任务,提高代码的复用性和可读性。在实际项目中...

    spring_aop2.rar_java spring_spring

    在实际应用中,Spring AOP通常与IoC(控制反转)和DI(依赖注入)结合使用,以创建松散耦合且易于维护的系统。通过Spring容器管理切面和目标对象,可以轻松地在运行时调整或扩展系统的行为。 总之,Spring AOP是...

    castle IOC AOP动态代理应用

    总的来说,结合使用Castle IOC和AOP动态代理,开发者可以构建出松散耦合、模块化的系统,提高代码的复用性和可测试性,同时还能优雅地处理系统中的横切关注点。在处理如WebService这样的远程服务时,这种能力尤为...

    spring aop ioc实例

    总结来说,Spring的IOC和AOP提供了强大的功能,帮助我们构建松散耦合、易于测试和维护的应用。通过理解并熟练运用这两个特性,开发者可以编写出更高效、更灵活的代码。在实际项目中,结合使用Spring AOP进行日志记录...

    Spring AOP总结

    **Spring AOP 概述** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了在不修改...通过理解并熟练掌握Spring AOP,我们可以更好地构建松散耦合、易于维护的Java应用。

    SoftBus, a lightweight Ioc and Aop container.

    当应用启动时,SoftBus会根据这些声明自动创建并管理对象,从而使得组件之间可以松散耦合,便于测试和维护。 **2. AOP(面向切面编程)** AOP允许开发者将关注点从核心业务逻辑中分离出来,如日志记录、事务管理等...

    轻量级的.NET对象查找服务和AOP开发框架源码

    总的来说,这个轻量级的.NET框架提供了强大的工具来构建松散耦合、易于测试和扩展的应用程序。通过IOC容器,开发者可以实现灵活的依赖管理,通过AOP,可以更有效地组织和插入横切关注点。对于希望深入理解这两种设计...

Global site tag (gtag.js) - Google Analytics