Spring AOP和AspectJ。需要有关周围建议的建议/意见

时间:2011-09-22 22:12:43

标签: aspectj spring-aop

我在另一个论坛上发布了此消息,想知道我是否可以吸引更多人。

我正在开发一个由不同的Spring网络应用程序组成的应用程序。

说我们有:

  • ComponentA.jar
  • ComponentB.jar

和WAR文件:

  • Foo.war(包含ComponentA)
  • Baa.war(包含ComponentA& 以componentB)

我们使用Logback登录我们的调试日志。所以说应用程序的各个类具有以下记录器声明:

private static final Log log = LoggerFactory.getLogger(NAME_OF_WAR_FILE + "." + NAME_OF_CONTAINING_COMPONENT + "." + PACKAGE.CLASS_NAME);

所以例子:

package a.b.c;

public class SomeClass {
   private static final Log log = LoggerFactory.getLogger("Foo.war" + "." + "ComponentA" + "." + SomeClass.class);
}

package x.y.z;

public class SomeOtherClass {

   private static final Log log = LoggerFactory.getLogger("Baa.war" + "." + "ComponentA" + "." + SomeOtherClass .class);
}

假设war文件和组件的名称由属性设置,而不是硬编码。

是否可以使用可以执行以下操作的Aspect和建议(伪,因为我不确定是否可以完成):

@Aspect
public class TheAspect{

   @Around("execution of a method")
   public Object aroundSomething(ProceedingJoinPoint pjp){

      Log log = get the log instance from the class that this advice is running on

      if(log.isDebugEnabled())
         // log something

      Object o = pjp.proceed();

       if(log.isDebugEnabled())
         // log something else

     return o;

   }
}

这里的要点是使用类实例的日志写入日志文件,该类实例包含由建议拦截的方法。

该应用程序显示为由Foo.war和Baa.war组成的单个Web应用程序。 Foo.war和Baa.war都写入同一个日志文件。

示例:

2011-09-22 14:35:35.159 MDT,DEBUG,Foo.war.ComponentA.a.b.c.SomeClass,Hello World Debug message
2011-09-22 14:35:35.159 MDT,DEBUG,Baa.war.ComponentA.a.b.c.SomeClass,Hello World Debug message
2011-09-22 14:35:35.159 MDT,DEBUG,Baa.war.ComponentB.x.y.z.SomeOtherClass,Hello World Debug message

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以在thisJoinPoint方法中使用aroundSomething

获取班级名称:

Signature sig = thisJoinPoint.getSignature();
String className = sig.getDeclaringTypeName();

您还可以获取类对象:

Class<?> type = sig.getDeclaringType();

也许您可以使用该软件包来识别您的war文件:

Package pack type.getPackage();