方面没有执行

时间:2012-03-07 16:00:38

标签: java spring java-ee spring-aop

我正在尝试测试一个简单的方面。 该应用程序编译并运行正常,但我没有得到Aspect执行。或者至少,我没有得到方面应该产生的输出。 (我的目的是为应用程序中出现的任何ex编写异常记录器。但首先应运行此测试方面...)

也许在方面有更多经验的人会看到我做错了什么?

package business;
public interface Customer {
    void addCustomer();
}

import org.springframework.stereotype.Component;
@Component
public class CustomerImpl implements Customer {

    public void addCustomer() {
        System.out.println("addCustomer() is running ");
    }
}



@RequestScoped @Named
//this is backing bean for jsf page
public class Service {

     @Inject
     Customer cust;

    add() {
        System.out.println("Service is running ");
        cust.addCustomer();
    }
}


@Aspect
public class AspectComp {
    @Before("within(business..*)")
    public void out() {
     System.out.println("system out works!!");
 }
}

弹簧:

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:beans="http://www.springframework.org/schema/beans"
    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
    ">

    <context:annotation-config />
    <context:component-scan base-package="business" />

    <aop:aspectj-autoproxy />
</beans>

输出:

Service is running 
addCustomer() is running 

缺少Aspect语句。

2 个答案:

答案 0 :(得分:2)

您正在使用其构造函数创建Component,而不是从Spring容器中获取它!这就是问题所在,或者你必须使用AspectJ的加载时间编织器。

只需在您的服务中注入您的组件(CustomerImpl),然后使用注入的实例。

答案 1 :(得分:0)

我记得有一次类似的问题; Spring实际上并没有加载代理,因为它没有将@Aspect注释识别为可注释的bean。我将@Component注释添加到@Aspect表示法中,Spring开始扫描它。

我从未调查过这种情况发生的原因,以及为什么我需要这样做,所以我不能确认这是“正确”的做事方式。我的直觉告诉我,我的配置文件中缺少一些东西;我无法想象为什么Spring不会扫描@Aspect bean。

您可以做的另一件事是在XML配置文件中显式声明Aspect bean,看看这是否与您遇到的问题类型相同。

您还可以在Spring框架中启用调试日志记录,并查看Spring是否正在加载您的bean。如果没有,那么它会让你知道从哪里开始寻找。