AspectJ在Eclipse中无法正常工作

时间:2012-08-28 20:55:58

标签: java spring aop aspectj spring-aop

我尝试在java中创建一个简单的程序。

在我的节目中:

1)人类 - 带注释方法

2)Aspect Class。

现在我要做的是在设置人名之前,将一些数据打印到日志文件和控制台。

所以这就是我所做的:

人员类

package pack.bl;

import org.springframework.stereotype.Component;
import pack.aop.LogLevel;
import pack.aop.TestAnnotation;

@Component
public class Person {

private String name,dest;
public Person(String name,String dest)
{
    this.setName(name);
    this.setDest(dest);
}

public String getName() {
    return name;
}

@TestAnnotation(value=LogLevel.INFO)
public void setName(String name) {
    this.name = name;
    System.out.println("Im " + this.toString() + " My name was changed to " + name);
}

public String getDest() {
    return dest;
}

@TestAnnotation(value=LogLevel.INFO)
public void setDest(String dest) {
    this.dest = dest;
}

@Override
public String toString()
{
    return this.name + "\n";
}

public static void main(String[] args) {
    Person p = new Person("Person1","Kripton");
    p.setName("Person2");
}

}

Aspect Class

package pack.aop;

import java.util.Arrays;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.test.context.ContextConfiguration;


@Aspect
@ContextConfiguration(locations = {
        "applicationContext.xml"})

public class BeforeAdvice {

private Log logger = LogFactory.getLog("Logger");

@Before("@annotation(testAnnotation)")
public void myBeforeLogger(JoinPoint joinPoint,TestAnnotation testAnnotation)
{
    System.out.println("Okay - we're in the before handler...");
    System.out.println("The test annotation value is: " + testAnnotation.value());
    Signature signature = joinPoint.getSignature();
    String methodName = signature.getName();
    String stuff = signature.toString();
    String arguments = Arrays.toString(joinPoint.getArgs());
    logger.info("Write something in the log... We are just about to call method: "
    + methodName + " with arguments " + arguments + "\nand the full toString: "
    + stuff);
}

}

ApplicationContext.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"    
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
    http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd">

<aop:aspectj-autoproxy/>

<context:component-scan base-package="pack.bl.Person"/>

* 注意: LogLevel 是一个枚举。所以当我跑步的时候需要像那样工作 程序并设置人名,首先需要转到Aspect类中的'BeforeAdvice'(因为setName,用 @testAnnotation 注释)方法,并执行此方法..之后需要回到setName方法并设置人名。 *

还有一件事,testAnnotation是我创建的Annotation

1 个答案:

答案 0 :(得分:4)

你没有提到任何关于你如何编织问题的内容。从我所看到的,看起来你将作业委托给Spring容器。但是你使用Spring AOP而不是AspectJ。虽然您也可以在Spring AOP中使用AspectJ注释。

我的建议是你把它分成两个案例。首先确保编译AspectJ方面并使用仅使用System.out.println(..)的simpe通知方法,然后确保Spring配置与您的方面和Log枚举集成。

使用AJDT Eclipse插件

要启用AspectJ编织,最简单的替代方法是使用AspectJ plugin并使用编译时编织。右键单击项目并启用AspectJ特性后,您将在代码中看到编辑建议的橙色箭头。请参阅下面的图片以获取示例。

我不确定你的切入点是否有效。如果你的建议没有在任何地方编织,你应该尝试这个切入点:

@Pointcut("execution(@pack.aop.TestAnnotation * *(..)) ")
public void logMethod() {}

建议如下:

@Before("logMethod()")
public void beforeLogMethod(JoinPoint joinPoint) {
    System.out.println("Logging..");
}

将方面和枚举与Spring容器集成

其次,由于方面是在Spring容器之前创建的,因此您必须从Aspect的工厂方法Aspects.aspectOf(pack.aop.BeforeAdvice.class)检索方面,或者在Spring配置中使用factory方法。

从Spring XML配置中,您可以像这样检索方面(对象):

<bean id="beforeAdvice" class="apack.aop.BeforeAdvice"
    factory-method="aspectOf" />

您还必须使用factory-method来检索在Spring容器外部创建的记录器。

我编写了一个相关的blog post,用一个例子解释了你的大部分问题,以及一张AJDT Eclipse插件工作优雅的图片。

enter image description here

图像显示两个箭头,说明了一个建议,最后一个箭头说明了一个建议。