簡體   English   中英

使用注釋的Spring 3的AOP

[英]AOP with Spring 3 using Annotations

我正在嘗試讓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測試類中來完成這項工作。

很高興看到您可以通過XML使用它,但是也可以通過注釋來完成它。

問題在於@Aspect注釋不是Spring原型,因此掃描程序未將方面注冊為Spring Bean。 只需在@Aspect上方或下方添加@Service@Component ,它將被注冊。

同樣,按照標准Spring設計,直接命名bean(例如, @Service("myNamedService") )或使其實現接口(例如, public class AttributeAspect implements IAspect { )。

如果要在調用它的同一bean形式中攔截方法的調用,則需要使用真實的AspectJ。 (如果方法testAttributeAspect()位於另一個bean中,則完成的工作應該可以。)


如何做真正的AspectJ?

使用AspectJ編譯器和weaver可以使用完整的AspectJ語言,將在第7.8節“在Spring應用程序中使用AspectJ”中進行討論。

@請參閱Spring參考

一些東西:

首先,當您處理建議時,您需要編寫如下建議方法:

@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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM