2011-10-17 50 views
2

我在一個maven項目模塊中有一個方面com.x.NiceAspect,而在單獨的maven模塊中有一個com.x.NiceClass類。這些模塊具有相同的POM父級,共同創建一個項目。在單獨模塊中使用Spring AOP方面

我想要實現的目標是在本項目中的所有我的Maven模塊中都包含一個通用的方面。

現在在NiceAspect切入點是即執行(* com.x .. .SET(..))含義礦包中的所有setter方法。

我想這方面與第二模塊運行,特別是加入NiceClass

我怎樣才能做到這一點?

此外假設該方面希望就是這樣第二模塊中定義的類的參數,那麼我結束了循環依賴..

任何幫助理解

此致

X。

回答

0
  • 我想這方面與第二模塊運行,特別是加入NiceClass

    如果切入點匹配來自「另一個」模塊的方法,該方面將適用。除了正確設置您的依賴關係之外,您不需要做任何特殊的事情。例如全局導入您的AOP配置。

  • 此外假設該方面希望就是這樣第二模塊中定義的類的參數,那麼我結束了循環依賴..

    在類參數的方面的依賴性不應導致循環依賴,因爲你有一個連接這兩者的父POM,並且在運行時這兩個模塊都在類路徑中。

一般來說,建議遵循方面的結構被Spring documentation描述=>創建總體SystemArchitecture切面,然後根據需要添加更多的縮小範圍方面:

@Aspect 
public class SystemArchitecture { 

    /** 
    * A join point is in the web layer if the method is defined 
    * in a type in the com.xyz.someapp.web package or any sub-package 
    * under that. 
    */ 
    @Pointcut("within(com.xyz.someapp.web..*)") 
    public void inWebLayer() {} 

    /** 
    * A join point is in the service layer if the method is defined 
    * in a type in the com.xyz.someapp.service package or any sub-package 
    * under that. 
    */ 
    @Pointcut("within(com.xyz.someapp.service..*)") 
    public void inServiceLayer() {} 

    /** 
    * A join point is in the data access layer if the method is defined 
    * in a type in the com.xyz.someapp.dao package or any sub-package 
    * under that. 
    */ 
    @Pointcut("within(com.xyz.someapp.dao..*)") 
    public void inDataAccessLayer() {} 

    /** 
    * A business service is the execution of any method defined on a service 
    * interface. This definition assumes that interfaces are placed in the 
    * "service" package, and that implementation types are in sub-packages. 
    * 
    * If you group service interfaces by functional area (for example, 
    * in packages com.xyz.someapp.abc.service and com.xyz.def.service) then 
    * the pointcut expression "execution(* com.xyz.someapp..service.*.*(..))" 
    * could be used instead. 
    * 
    * Alternatively, you can write the expression using the 'bean' 
    * PCD, like so "bean(*Service)". (This assumes that you have 
    * named your Spring service beans in a consistent fashion.) 
    */ 
    @Pointcut("execution(* com.xyz.someapp.service.*.*(..))") 
    public void businessService() {} 

    /** 
    * A data access operation is the execution of any method defined on a 
    * dao interface. This definition assumes that interfaces are placed in the 
    * "dao" package, and that implementation types are in sub-packages. 
    */ 
    @Pointcut("execution(* com.xyz.someapp.dao.*.*(..))") 
    public void dataAccessOperation() {} 

} 

這樣任何未來可能需要的方面,可以重複使用整個系統架構方法,以及與實際應用的模塊一起使用。

+0

謝謝您的回答。我將把這個模式應用到我的項目中。顯然,我不知道如何運行/編譯/打包來彈出aop項目。我在AspectJ中有一點經驗,但我不知道如何構建Spring AOP應用程序。你運行什麼maven目標?我的方面似乎沒有工作。我正在使用IDEA Community Edition 10.5.2 – emesx

+0

'spring aop project'與其他任何非web項目沒有區別,jar是由maven創建的。如果你使用AspectJ,你可以看看這個[示例](http://www.dotkam.com/2010/10/12/running-spring-aspectj-tests-with-maven/),看看它是如何使用maven進行配置。 – tolitius

+0

好的謝謝;-)我想我會從這裏管理。 – emesx

0

如果你已經把所有的項目聲明爲主要項目中的子項目,那麼包含該方面(以及方面本身)的項目將可用於其他兩個項目,並且基本上任何子項目都將具有作爲依賴關係的其他項目子項目。

你不會有一個圓形的依賴,由於包裝:

  • 如果您打包您的任何prject作爲一個可執行的JAR,那麼爲了讓它運行,你需要添加其他兩個subbrojects'當你運行它時,如果你將任何一個子項目打包爲一個戰爭(其他兩個打包爲jar),那麼當使用maven打包時,其他兩個子項目的jar將被添加到war的lib中文件夾有效地使它們在運行時可用於戰爭的類路徑。

+0

感謝您的幫助 – emesx