使用AspectJ的AOP在春天不工作?

时间:2013-03-27 14:56:53

标签: java spring aspectj spring-aop spring-annotations

我的Aspect类将是,

@Configuration
@EnableAspectJAutoProxy
@Component
@Aspect
public class AspectClass {

    @Before("execution(* com.pointel.aop.test1.AopTest.beforeAspect())")
    public void logBefore(JoinPoint joinPoint) {

        System.out.println("Before running the beforeAspect() in the AopTest.java class!");
        System.out.println("Hijacked Method name : " + joinPoint.getSignature().getName());
        System.out.println("************************");
    }

}

我的其他java类

public class AopTest {

    public void beforeAspect() {
        System.out.println("This is beforeAspect() !");
    }
}

我的主要课程是

public class MainMethod {

    public static void main(String[] args) {    
        ApplicationContext context = new FileSystemXmlApplicationContext("ApplicationContext/applicationContext.xml");
        AopTest test = (AopTest)context.getBean("bean1");
        test.beforeAspect();
    }
}

我的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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">

    <bean id="bean1" class="com.pointel.aop.test1.AopTest" />

</beans>

在运行Main方法时,@Before("execution(* com.pointel.aop.test1.AopTest.beforeAspect())")AspectClass中的beforeAspect()将不会在AopTest之前执行。

肯定赞赏好的答案。

4 个答案:

答案 0 :(得分:4)

首先,如果您要使用基于注释的配置,请使用AnnotationConfigApplicationContext代替FileSystemXmlApplicationContext。并删除applicationContext.xml文件,只需在配置类中添加@Bean方法即可。像这样:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = "your.aspect.package")
public class AspectConfig {
    @Bean 
    public AopTest aopTest() {
        return new AopTest();
    }
}

在你的主要

public class MainMethod {

    public static void main(String[] args) {    
        AnnotationConfigApplicationContextcontext = new AnnotationConfigApplicationContext(AspectConfig.class);
        // don't forget to refresh
        context.refresh();
        AopTest test = (AopTest)context.getBean("aopTest");
        test.beforeAspect();
    }
}

AspectClass中,您应该@Component@Aspect,并且您的方法应该有@Before之类的建议或切入点注释。它需要是@Component,以便Spring知道扫描它。

答案 1 :(得分:1)

这里有些代码需要在xml中添加以使用注释 - 1.for @component注释。

xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" 

2.之后使用组件扫描获取使用@component注释的所有带注释的bean类,并使用aop autoproxy -

<context:annotation-config/>
<context:component-scan base-package="mypackage"></context:component-scan>
 <aop:aspectj-autoproxy>
</aop:aspectj-autoproxy>

例如访问 - www.technicaltoday.com/p/spring.html

答案 2 :(得分:0)

您缺少方面类中的切入点定义。

例如;

@Pointcut("execution(* *.advice(..))")  
public void logBefore(){}  

@Before("logBefore()")  
public void beforeAdvicing(){  
System.out.println("Listen Up!!!!");  
}  

首先,您必须明确自己的方方面面。您可以使用Point cuts来实现此目的。它是您在@Before注释中提供的切入点名称。有关详细信息@ http://dinukaroshan.blogspot.com/2010/06/aop-with-spring.html

,请查看我的博客文章

答案 3 :(得分:0)

我没有在bean配置中看到你的AspectClass。您还应该将其声明为Bean。