我想在我的应用程序中使用Spring AOP来做一些日志记录的事情,我已经在一个独立的应用程序中使用了AOP,它工作了,但是现在在一个tomcat上的web应用程序中它不工作了。
我有一个应用程序核心和一个应用程序网络项目,在核心项目中所有的逻辑发生,而网络项目只包含网络相关的东西。
首先,我尝试将LoggingAspect类添加到我的核心项目中,因为这不起作用,所以我现在将其移动到Web项目中,但尽管在那里它不起作用。
下面是我的applicationContext.xml文件夹:/应用程序-Web/源代码/主/Web应用程序
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- Add AspectJ autoproxy support for AOP -->
<aop:aspectj-autoproxy/>
<!-- Step 3: Add support for component scanning -->
<context:component-scan base-package="my.foobar"/>
<!-- Step 4: Add support for conversion, formatting and validation support -->
<mvc:annotation-driven/>
<!-- Step 5: Define Spring MVC view resolver -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
这是我的LoggingAspect类,现在位于:应用程序-web/src/main/my.foobar.web/方面/日志方面
@Aspect
@Order(1)
public class LoggingAspect {
private static final LogHandler LOG = LogHandler.getLogger(LoggingAspect.class);
@Pointcut("execution(* my.foobar.*.*.*(..))")
private void completePackage(){}
@Pointcut("execution(* my.foobar.*.*.get*(..))")
private void getterMethods(){}
@Pointcut("execution(* my.foobar.*.*.set*(..))")
private void setterMethods(){}
@Pointcut("completePackage() && !(getterMethods() || setterMethods())")
private void allMethodsExceptGetterAndSetter(){}
@Around("completePackage()")
private Object aroundMethod(ProceedingJoinPoint theProceedingJointPoint) throws Throwable{
LOG.info("around method");
String method = theProceedingJointPoint.getSignature().getName();
Object[] arguments = theProceedingJointPoint.getArgs();
LOG.info("method call: {0}", method);
for(Object arg: arguments){
LOG.info("argument[{0}]", arg);
}
Object result = theProceedingJointPoint.proceed();
return result;
}
}
我还向应用程序Web项目中添加了一个类
@Configurable
@EnableAspectJAutoProxy
@ComponentScan("my.foobar")
public class ApplicationWebAppConfig {
}
我所期望的是,每个被调用的方法都将被记录,但这并没有发生。
2条答案
按热度按时间dluptydi1#
我想我已经解决了我的问题。我想我可以在我的应用程序中只使用spring-aop作为一个独立的特性。我添加了一些JSP页面,并第一次使用spring-mvc,在此期间,我看到了spring-aop,并想为什么不使用它来对我的方法进行一些额外的测量。我的示例独立应用程序运行得非常好,这就是为什么我试图将其适应我现有的应用程序。但问题从这里开始,我想测量的方法*与Spring无关**,因此从 kriegaexhere发布的这是不工作的。
是的,Spring依赖于动态代理(默认情况下JDK代理实现接口的类,CGLIB代理不实现接口的类),这些代理只在Spring组件上工作,因为只有那些组件在连接应用程序时被Spring代理。AspectJ直接编织到原始类的字节码中,也可以应用于非Spring类。只要它们在AspectJ被激活时还没有被加载(例如JRE类)。
我的解决方案有点令人失望,我在这一点上停止了我的特性分支,因为目前要解决它需要付出很多努力,正如我所读到的,你的回答建议我需要通过LTW切换到AspectJ。
如果你的应用程序已经在工作了,如果你做得对,就像Spring手册中描述的那样,把配置从Spring AOP改为AspectJ只需要几分钟的时间。我鼓励你给予一下,这真的不是那么难。祝你好运。
hs1ihplo2#
我想我已经解决了我的问题。我想我可以在我的应用程序中只使用spring-aop作为一个独立的特性。我添加了一些JSP页面,并第一次使用spring-mvc,在此期间,我看到了spring-aop,并想为什么不使用它来对我的方法进行一些额外的测量。我的示例独立应用程序运行得非常好,这就是为什么我试图将其适应我现有的应用程序。但问题从这里开始,我想测量的方法与Spring无关,所以从@kriegaex这里Spring AOP for non spring component发布到这里,这是行不通的