关于带注释的控制器的 Spring AOP 建议 [英] Spring AOP Advice on Annotated Controllers
问题描述
我正在尝试使用 AOP 在带注释的控制器之后进行一些处理.一切都在运行,没有错误,但没有执行建议.
I am trying to use AOP to do some processing after an annotated controller. Everything is running with no errors, but the advice is not being executed.
这是控制器代码:
@Controller
public class HomeController {
@RequestMapping("/home.fo")
public String home(ModelMap model) {
model = new ModelMap();
return "home";
}
}
和 application-config 中的设置
and the setup in application-config
<aop:aspectj-autoproxy/>
<bean id="testAdvice" class="com.test.TestAdvice">
</bean>
<bean id="testAdvisor"
class="org.springframework.aop.aspectj.AspectJExpressionPointcutAdvisor">
<property name="advice" ref="testAdvice" />
<property name="expression" value="execution(* *.home(..))" />
</bean>
和实际建议
public class TestAdvice implements AfterReturningAdvice {
protected final Log logger = LogFactory.getLog(getClass());
public void afterReturning(Object returnValue, Method method, Object[] args,
Object target) throws Throwable {
logger.info("Called after returning advice!");
}
}
甚至可以对带注释的控制器提出建议吗?我使用的是 Spring 2.5.
Is it even possible to have advice on annotated controllers? I am using Spring 2.5.
推荐答案
可以对带注释的控制器提出建议.
It's possible to have advice on annotated controllers.
我假设您想在用 @Controller
注释的类中的所有方法执行后给出建议.
I assume you want to advice after execution of all methods in classes annotated with @Controller
.
这是一个例子:
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class ControllerAspect {
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void controllerBean() {}
@Pointcut("execution(* *(..))")
public void methodPointcut() {}
@AfterReturning("controllerBean() && methodPointcut() ")
public void afterMethodInControllerClass() {
System.out.println("after advice..");
}
}
如果你想使用带有 AspectJ 语法的 Spring AOP,你还需要一个这样的配置文件:
If you want to use Spring AOP with AspectJ syntax, you also need a configuration file like this:
<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="controllerAspect" class="controller.ControllerAspect" />
<aop:aspectj-autoproxy>
<aop:include name="controllerAspect" />
</aop:aspectj-autoproxy>
</beans>
注意:使用Spring AOP,Spring容器只会编织Spring bean.如果 @Controller
对象不是 Spring bean,则必须使用 AspectJ 编织.
Note: With Spring AOP, the Spring container will only weave Spring beans. If the @Controller
object isn't a Spring bean, you must use AspectJ weaving.
这篇关于关于带注释的控制器的 Spring AOP 建议的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!