Spring AspectJ 不拦截的 AOP
Spring AOP with AspectJ not intercepting
我正在写我的第一个 AOP。我粘贴了下面的代码,该代码未在方法调用中被拦截。
我不确定是什么原因。
在控制台上它只打印:
addCustomerAround() 是 运行,args : dummy
和none的AOP通知代码被打印出来。
有人可以帮忙吗?
接口:
package com.test.model;
import org.springframework.beans.factory.annotation.Autowired;
public interface AopInterface {
@Autowired
void addCustomerAround(String name);
}
Class:
package com.test.model;
import com.test.model.AopInterface;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
@Component
public class AopClass implements AopInterface {
public void addCustomerAround(String name){
System.out.println("addCustomerAround() is running, args : " + name);
}
}
AOP:
package com.test.model;
import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TestAdvice{
@Around("execution(* com.test.model.AopInterface.addCustomerAround(..))")
public void testAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("testAdvice() is running!");
System.out.println("hijacked method : " + joinPoint.getSignature().getName());
System.out.println("hijacked arguments : " + Arrays.toString(joinPoint.getArgs()));
System.out.println("Around before is running!");
joinPoint.proceed();
System.out.println("Around after is running!");
System.out.println("******");
}
}
appcontext.xml:
<!-- Aspect -->
<aop:aspectj-autoproxy />
<bean id="AopClass" class="com.test.model.AopClass" />
<bean id="TestAdvice" class="com.test.model.TestAdvice" />
POM:
<!-- AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
方法调用:
aoptest.addCustomerAround("dummy");
我在这里没有看到任何错误。我刚刚尝试了您的代码并且运行良好。
我的测试 class:
public class App {
public static void main(String[] args) throws Exception {
ApplicationContext appContext = new ClassPathXmlApplicationContext("appcontext.xml");
//-------------------------
AopClass aopClass = (AopClass) appContext.getBean("AopClass");
aopClass.addCustomerAround("dummy");
}
}
结果
你能重试构建你的maven项目吗?!然后再试一次?!
根据 Aspect Oriented Programming with Spring,当 class 实现接口时,将使用 JDK 动态代理,如果未实现接口,则将创建 CGLIB 代理.要强制使用 CGLIB 代理,您必须设置 proxy-target-class="true".
appcontext.xml:
<!-- Aspect -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<bean id="AopClass" class="com.test.model.AopClass" />
<bean id="TestAdvice" class="com.test.model.TestAdvice" />
输出:
testAdvice() is running!
hijacked method : addCustomerAround
hijacked arguments : [dummy]
Around before is running!
addCustomerAround() is running, args : dummy
Around after is running!
******
我正在写我的第一个 AOP。我粘贴了下面的代码,该代码未在方法调用中被拦截。 我不确定是什么原因。
在控制台上它只打印:
addCustomerAround() 是 运行,args : dummy
和none的AOP通知代码被打印出来。
有人可以帮忙吗?
接口:
package com.test.model;
import org.springframework.beans.factory.annotation.Autowired;
public interface AopInterface {
@Autowired
void addCustomerAround(String name);
}
Class:
package com.test.model;
import com.test.model.AopInterface;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
@Component
public class AopClass implements AopInterface {
public void addCustomerAround(String name){
System.out.println("addCustomerAround() is running, args : " + name);
}
}
AOP:
package com.test.model;
import java.util.Arrays;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TestAdvice{
@Around("execution(* com.test.model.AopInterface.addCustomerAround(..))")
public void testAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("testAdvice() is running!");
System.out.println("hijacked method : " + joinPoint.getSignature().getName());
System.out.println("hijacked arguments : " + Arrays.toString(joinPoint.getArgs()));
System.out.println("Around before is running!");
joinPoint.proceed();
System.out.println("Around after is running!");
System.out.println("******");
}
}
appcontext.xml:
<!-- Aspect -->
<aop:aspectj-autoproxy />
<bean id="AopClass" class="com.test.model.AopClass" />
<bean id="TestAdvice" class="com.test.model.TestAdvice" />
POM:
<!-- AOP -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.11</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.11</version>
</dependency>
方法调用:
aoptest.addCustomerAround("dummy");
我在这里没有看到任何错误。我刚刚尝试了您的代码并且运行良好。 我的测试 class:
public class App {
public static void main(String[] args) throws Exception {
ApplicationContext appContext = new ClassPathXmlApplicationContext("appcontext.xml");
//-------------------------
AopClass aopClass = (AopClass) appContext.getBean("AopClass");
aopClass.addCustomerAround("dummy");
}
}
你能重试构建你的maven项目吗?!然后再试一次?!
根据 Aspect Oriented Programming with Spring,当 class 实现接口时,将使用 JDK 动态代理,如果未实现接口,则将创建 CGLIB 代理.要强制使用 CGLIB 代理,您必须设置 proxy-target-class="true".
appcontext.xml:
<!-- Aspect -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<bean id="AopClass" class="com.test.model.AopClass" />
<bean id="TestAdvice" class="com.test.model.TestAdvice" />
输出:
testAdvice() is running!
hijacked method : addCustomerAround
hijacked arguments : [dummy]
Around before is running!
addCustomerAround() is running, args : dummy
Around after is running!
******