我尝试在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
答案 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插件工作优雅的图片。
图像显示两个箭头,说明了一个建议,最后一个箭头说明了一个建议。