2013-01-22 52 views
7

我AMS使用Spring 2.5.6,1.5.3 ASM,aspectjrt/aspectjweaver 1.6.1,CGLIB 2.1_3 在我的基于Web的Spring应用程序我有以下类:的Spring AOP(宽)不执行

package uk.co.txttools.aspects; 

@Aspect 
public class LoggingAspect { 
    @Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))") 
    public void setLoggingAdvice(){ 
     System.out.println("********************************* Advice run..... set mothod called...."); 
    } 

    @AfterThrowing("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)") 
    public void hadleException(){ 
     System.out.println("================= PreviewMessageController =========== ON SUBMIT Exception Throwen =================="); 
    } 

    @Before("execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.onSubmit(..) throws java.lang.Exception)") 
    public void OnSubmitAspect(){ 
     System.out.println("================= PreviewMessageController =========== ON SUBMIT CALLED =================="); 
    } 
} 

我有一个Controller:uk.co.txttools.web.controller.compose.PreviewMessageController which has onSubmit()method, which get called from web page. I have separate applicationContext.xml`文件。

springapp-servlet.xml(在web.xml文件中使用org.springframework.web.servlet.DispatcherServlet)文件是这样的:

<?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: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-2.5.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
      http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd"> 

<aop:aspectj-autoproxy proxy-target-class="true" /> 

<bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" /> 
. 
. 

低于同一XML文件PreviewMessageController得到初始化,这意味着我的控制器和看点生活是相同的容器。

我在运行应用程序时没有遇到任何异常,但我的方面类LoggingAspect永远不会被调用。 我不确定那是什么错过或我做错了。 请帮助我..

感谢

回答

8

终于解决了它。

我想我缺少aspectj-maven-plugin。它需要春天来编织各个方面。尽管没有教程提供这些信息。添加以下到我的pom.xml。

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>aspectj-maven-plugin</artifactId> 
    <version>1.0</version> 
    <dependencies> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjrt</artifactId> 
      <version>1.6.1</version> 
     </dependency> 
     <dependency> 
      <groupId>org.aspectj</groupId> 
      <artifactId>aspectjtools</artifactId> 
      <version>1.6.1</version> 
     </dependency> 
    </dependencies> 
    <executions> 
     <execution> 
      <goals> 
       <goal>compile</goal> 
       <goal>test-compile</goal> 
      </goals> 
     </execution> 
    </executions> 
    <configuration> 
     <outxml>true</outxml> 
     <verbose>true</verbose> 
     <showWeaveInfo>true</showWeaveInfo> 
     <aspectLibraries> 
      <aspectLibrary> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring-aspects</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
     <source>1.6</source> 
     <target>1.6</target> 
    </configuration> 
</plugin> 

谢谢你们

+1

不,该插件不需要编织Spring AOP方面,只有当你想使用完整的AspectJ加载时编织或编译时编织。你所做的就是使用CTW。真正的修复将会是修复你的Spring AOP配置。 – kriegaex

0

在您的配置文件试试这个:

<aop:aspectj-autoproxy proxy-target-class="true"> 
    <aop:include name="loggingAspect"/> 
</aop:aspectj-autoproxy> 
+0

它仍然无法正常工作,我仍然得到也不例外,但我的方面永远不会打电话。我认为我的控制器没有代理,因此AOP将无法工作。我认为在路径中使用cglib并且会解决这个问题,但不知道缺少什么? – bhavin

+0

检查我的其他答案为基于xml的配置.. – Vikram

1

如果你还没有尝试过...尝试基于XML的弹簧AOP配置如下:

<aop:config> 
    <aop:aspect ref="loggingAspect"> 
     <aop:pointcut expression="execution(* uk.co.txttools.web.controller.compose.PreviewMessageController.set*(..))" id="previewMessageControllerSetters"/> 
     <aop:before method="setLoggingAdvice" pointcut-ref="previewMessageControllerSetters"/> 

     // set other 2 pointcuts similarly.... 
     </aop:aspect>  
    </aop:config> 
    <bean id="loggingAspect" class="uk.co.txttools.aspects.LoggingAspect" /> 
+0

感谢您的回复Vikram,但我也尝试过,即使基于XML的配置不起作用。我认为Cglib无法为我生成代理。任何意见在那? – bhavin

+0

@ bhavin.patel我认为你用'proxy-target-class =“true”'完成的工作应该符合你的目的...我认为问题可能与aspectjrt和aspectjweaver jar文件有关......我使用Spring 3.0使用aspectjrt和aspectweaver版本1.6.8。如果你的项目是基于Maven的,并且你不介意升级到Spring 3。0你可以快速交换和检查.. – Vikram

+0

甚至更​​好,如果你可以换出你的代码中的cglib依赖关系,并检查它是否适用于Spring 2.5/AspectJ 1.5.3。如果您使用的是Spring IDE,那么您将在所有方法上都有标记,这些方法将被建议......这样,至少您可以了解一些方面是否已经编译好...... – Vikram

13

我不知道如果我这样做是正确的,但对我来说有什么解决它添加@Component到“Aspect'ed”类 -

@Aspect 
@Component 
public class PerformanceLogger { 

    private Logger logger = LoggerFactory.getLogger(this.getClass()); 

    @Around("within(com.something.rest.service..*)") 
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { 
     long start = System.currentTimeMillis(); 
     Object retVal = pjp.proceed(); 
     long end = System.currentTimeMillis(); 
     logger.debug(pjp.getSignature().toShortString() + " Finish: " + (end - start) + "ms"); 
     return retVal; 
    } 
} 

(和只是为了关闭循环 - 如果您使用基于注释的标记,请不要忘记将@EnableAspectJAutoProxy添加到您的配置类。

@EnableAspectJAutoProxy 
+0

我想知道为什么这不是在文档中更清楚。它也解决了我的问题。 – idipous

3

对于那些谁选择了JavaConfig,你可以宣布你的Aspect作为一个bean,并添加注释@EnableAspectJAutoProxy开启自动代理:

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan 
public class MyConfig { 
    @Bean 
    public LoggingAspect loggingAspect(){ 
     return new LoggingAspect(); 
    } 
}