1

我正在尝试让 Aspect 与 Spring 3 和注释一起使用。

@Aspect
public class AttributeAspect {

  @Pointcut("@annotation(com.mak.selective.annotation.Attribute)")
  public void process(){
    System.out.println("Inside Process ....");
  }

  @Around("process()")
  public void processAttribute(){
    System.out.println("Inside Actual Aspect ..");
  }
}

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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans                 http://www.springframework.org/schema/beans/spring-beans.xsd       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
 <aop:aspectj-autoproxy proxy-target-class="false" />
<context:component-scan base-package="com.mak.selective.annotation.*" />
<bean name="attribute" class="com.mak.selective.annotation.AttributeAspect"/>
</beans>

测试方面的我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/springcontext/*.xml")
public class AttributeTest {

@Attribute(tableName = "firstTable", columnName = "New Column")
private void getAttribute() {
    System.out.println("Inside Attribute call...");
}

@Test
public void testAttributeAspect() {
    getAttribute();
}

}

使用此代码,我只能看到“内部属性调用...”,但从 Aspect 看不到任何内容。请指导。

通过制作一个新的对象(组件)并注入到 Junit 测试类中来实现这一点。

4

3 回答 3

1

很高兴看到您从 XML 中获得了它,但您也可以从注释中完成它。

问题是@Aspect注解不是 Spring 原型,因此扫描器没有将方面注册为 Spring Bean。只需添加@Service@Component高于或低于@Aspect,它将被注册。

此外,根据标准 Spring 设计,要么直接命名 bean(例如,@Service("myNamedService")),要么让它实现一个接口(例如, )。public class AttributeAspect implements IAspect {

于 2011-09-21T14:23:23.920 回答
0

一些东西:

首先,当你做周围的建议时,你需要编写这样的建议方法:

@Around(...)
public void aroundAdviceMethod(ProceedingJoinPoint pjp) throws Throwable {
    try {
        System.out.println("before...");
        pjp.proceed();
    }
    finally {
        System.out.println("After...");
    }
}

而且(这至少在您使用代理时适用,在您的情况下并不完全确定),您提出建议的方法需要公开(您的不是),弹簧管理(通过 @Component 或其他方式) 并从类外部调用,以便代理可以生效(在您的示例中也不是这种情况)。所以你需要这样的东西:

@Component
public class SomeClass {
    @Attribute
    public void someMethodCall() {
        System.out.println("In method call");
    }
}

public class SomeUnitTest {
    @Autowired SomeClass someClass;
    @Test 
    public void testAspect() {
        someClass.someMethodCall();
    }
}
于 2011-09-21T13:53:30.987 回答
0

如果要在调用它的同一 bean 表单中拦截方法调用,则需要使用真正的 AspectJ。(如果方法 testAttributeAspect() 位于其他 bean 中,您所做的应该可以工作。)


如何做真正的AspectJ?

使用 AspectJ 编译器和编织器可以使用完整的 AspectJ 语言,并在第 7.8 节“将 AspectJ 与 Spring 应用程序一起使用”中进行了讨论。

@见弹簧参考

于 2011-09-21T13:52:18.587 回答