Spring AOP @Pointcut没有触发

时间:2012-06-25 05:57:20

标签: java spring aop

我想在调用另一个类的特定方法时触发一个方法,这就是为什么我想使用@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

我还应该添加什么?下一步做什么?

2 个答案:

答案 0 :(得分:0)

检查以下内容。

1)检查OrgManagerImpl是否在上下文xml中被定义为bean,或者它被标记为@Component&在上下文xml中你有或那个类的包。

2)如果上面的内容是正确的,那么尝试更改切入点如下

@Pointcut("execution(* get*(..))")

此切入点拦截所有get方法。看看是否通过此点切割您的同步方法是否正常工作。如果它工作,那么至少你的弹簧配置是好的。你只需要改进切入点表达式。但是,如果这也不起作用那么你的弹簧配置本身有问题,所以我们可以专注于那些。

如果这不起作用,那么尝试提供一些更多的信息,比如上下文xml,bean java类等。

答案 1 :(得分:0)

您需要检查两件事。

  1. aop:在配置
  2. 中启用了aspectj-autoproxy
  3. Point Cut / Aspect / Target是spring bean
  4. 以下是我的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();
        }
    }