2

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

在我的程序中:

1) Person 类 - 带注释的方法

2)方面类。

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

所以这就是我所做的:

人员类

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");
}

}

方面类

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

4

1 回答 1

4

你没有提到任何关于你如何编织你的问题的事情。从我所见,看起来您将作业委托给了 Spring 容器。但是你使用的是 Spring AOP 而不是 AspectJ。尽管您也可以将 AspectJ 注释与 Spring AOP 一起使用。

我的建议是你把它分成两种情况。首先确保编织 AspectJ 方面并使用仅使用的简单建议方法System.out.println(..),然后确保 Spring 配置与您的方面和日志枚举集成。

使用 AJDT Eclipse 插件

要启用 AspectJ 编织,最简单的替代方法是使用AspectJ 插件并使用编译时编织。在您右键单击您的项目并启用 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 配置中使用工厂方法。

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

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

您还必须使用工厂方法来检索在 Spring 容器之外创建的记录器。

我写了一篇相关的博客文章,用一个例子解释了你的大部分问题,并用图片说明了 AJDT Eclipse 插件的工作方式。

在此处输入图像描述

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

于 2012-08-29T09:46:45.363 回答