我正在尝试测试一个简单的方面。 该应用程序编译并运行正常,但我没有得到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语句。
答案 0 :(得分:2)
您正在使用其构造函数创建Component,而不是从Spring容器中获取它!这就是问题所在,或者你必须使用AspectJ的加载时间编织器。
只需在您的服务中注入您的组件(CustomerImpl),然后使用注入的实例。
答案 1 :(得分:0)
我记得有一次类似的问题; Spring实际上并没有加载代理,因为它没有将@Aspect注释识别为可注释的bean。我将@Component注释添加到@Aspect表示法中,Spring开始扫描它。
我从未调查过这种情况发生的原因,以及为什么我需要这样做,所以我不能确认这是“正确”的做事方式。我的直觉告诉我,我的配置文件中缺少一些东西;我无法想象为什么Spring不会扫描@Aspect bean。
您可以做的另一件事是在XML配置文件中显式声明Aspect bean,看看这是否与您遇到的问题类型相同。
您还可以在Spring框架中启用调试日志记录,并查看Spring是否正在加载您的bean。如果没有,那么它会让你知道从哪里开始寻找。