我试图在带注释的控制器之后使用AOP进行一些处理。一切都在正常运行,但没有执行建议。
这是控制器代码:
@Controller public class HomeController { @RequestMapping("/home.fo") public String home(ModelMap model) { model = new ModelMap(); return "home"; } }
以及在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。
我假设你想在用注释的类中执行所有方法后提出建议@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.."); } }
如果你想将Spring AOP与AspectJ语法一起使用,则还需要这样的配置文件:
<?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编织。
@Controller