Spring совет AOP относительно аннотируемых контроллеров

Я пытаюсь использовать AOP, чтобы сделать некоторую обработку после аннотируемого контроллера. Все работает без ошибок, но совет не выполняется.

Вот код контроллера:

@Controller
public class HomeController {       
    @RequestMapping("/home.fo")
    public String home(ModelMap model) {
        model = new ModelMap();
        return "home";
    }   
}

и установка в прикладной конфигурации

<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.

20
задан skaffman 22 July 2010 в 18:52
поделиться

2 ответа

Для контроллеров MVC предпочтительным методом выполнения того, что вы пытаетесь сделать, является использование перехватчиков. См. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor

1
ответ дан 30 November 2019 в 00:51
поделиться

Можно получить совет по аннотированным контроллерам.

Я полагаю, вы хотите дать совет после выполнения всех методов в классах, помеченных @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. Если объект @Controller не является компонентом Spring, вы должны использовать переплетение AspectJ.

23
ответ дан 30 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: