我想在调用另一个类的特定方法时触发一个方法,这就是为什么我想使用@Pointcut。
下面的代码几乎与我编码的代码完全相同,我不会添加其他内容。
public class OrgManagerImpl implements OrgManager {
public IOrg getOrg(String orgShortName) {
}
}
这是应该触发的类:
@Aspect
public class OrgManagerSynchronizer {
@Pointcut("execution(* com.alvin.OrgManager.getOrg(..))")
public void classMethods() {}
@Before("classMethods()")
public void synchronize(JoinPoint jp) {
//code should be executed. but does not execute.
}
}
并在我的.xml中指定了:
aop:aspectj-autoproxy
我还应该添加什么?下一步做什么?
答案 0 :(得分:0)
检查以下内容。
1)检查OrgManagerImpl是否在上下文xml中被定义为bean,或者它被标记为@Component&在上下文xml中你有或那个类的包。
2)如果上面的内容是正确的,那么尝试更改切入点如下
@Pointcut("execution(* get*(..))")
此切入点拦截所有get方法。看看是否通过此点切割您的同步方法是否正常工作。如果它工作,那么至少你的弹簧配置是好的。你只需要改进切入点表达式。但是,如果这也不起作用那么你的弹簧配置本身有问题,所以我们可以专注于那些。
如果这不起作用,那么尝试提供一些更多的信息,比如上下文xml,bean java类等。
答案 1 :(得分:0)
您需要检查两件事。
以下是我的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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<aop:aspectj-autoproxy/>
<context:component-scan base-package="com.techoffice"/>
<bean class="com.techoffice.example.ExampleAspect"/>
</beans>
<强> ExampleAspect.java 强>
package com.techoffice.example;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class ExampleAspect {
@Pointcut("execution (* com.techoffice..*(..))")
public void anyRun() {}
@Before(value="anyRun()")
public void beforeAnyRun(JoinPoint jointPoint){
System.out.println("Before " + jointPoint.getClass().getName() + "." + jointPoint.getSignature().getName());
}
@After(value="anyRun()")
public void afterAnyRun(JoinPoint jointPoint){
System.out.println("After " + jointPoint.getClass().getName() + "." + jointPoint.getSignature().getName());
}
}
<强> HelloWorldExample 强>
package com.techoffice.example;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class HelloWorldExample {
public void run(){
System.out.println("run");
}
public static void main(String[] args){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
HelloWorldExample helloWorldExample = context.getBean(HelloWorldExample.class);
helloWorldExample.run();
}
}