2011-09-21 57 views
1

我正在嘗試使用Spring 3和註解來獲取Aspect。使用註釋的Spring 3的AOP

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

}

有了這個代碼,我只能看到 「內部屬性打電話......」但從方面沒有。 請指導。

通過製造新的對象(組件)得到這個工作,並注入到JUnit測試類。

回答

0

你需要的,如果你想攔截的同一個bean的形式,然後調用內部方法的調用使用真正的AspectJ。 (你做了什麼,應該如果方法testAttributeAspect()坐落在一個其他的bean工作。)


如何做到真正的AspectJ?

使用AspectJ編譯器和weaver可以使用完整的AspectJ語言,並在第7.8節「在AspectJ中使用Spring應用程序」中討論。

@see Spring Reference

0

有幾件事情:

首先,當你周圍的建議你需要編寫的建議方法是這樣的:

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

而且(此至少在你使用代理時適用,在你的情況下不能完全確定),你提供建議的方法需要公開(你的不是),彈簧託管(通過@Component或其他方式),並稱爲外部cl所以代理可以生效(在你的例子中也不是這種情況)。所以,你需要的東西是這樣的:

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

高興地看到,你得到了它從XML的工作,但你可以也從註釋做了。

問題是,@Aspect註釋不是Spring的原型,所以掃描器沒有註冊爲Spring Bean的方面。只需添加@Service@Component高於或低於@Aspect,它將被註冊。按照標準Spring設計,還可以直接命名該bean(例如,@Service("myNamedService"))或使其實現接口(例如,public class AttributeAspect implements IAspect {)。