用于非Beans类的Spring AOP

时间:2015-02-20 18:10:25

标签: java spring spring-mvc spring-aop

我正在尝试学习Spring AOP,据我所知,它可以通过代理工作,并且只能将方面应用于bean,使用代理而不是直接使用bean。 所以我有

@Controller
public class CMSHelloWorld {

    String message;

    @RequestMapping("/welcome")
    public ModelAndView helloWorld() {

        if (message == null || message.equals("")) {
            ApplicationContext context = new ClassPathXmlApplicationContext("appContext.xml");
            MessageBean messageBean = (MessageBean) context.getBean("simpleServiceProxy");
            message = messageBean.getMessage();
        }
        return new ModelAndView("welcome", "message", message);
    }
//getters & setters omitted
}

我也有非常简单的bean:

public class MessageBean {
    String message;
    //getters & setters omitted
}

并配置:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd">

<bean id="simpleServiceBean" class="com.beans.MessageBean">
        <property name="message" value="Hello" />
    </bean> 
    <bean id="simpleControllerBean" class="com.controller.CMSHelloWorld">
    </bean>

    <bean id="doBeforeMethodBean"
        class="com.demshin.advice.DoBeforeMethod" />

    <bean id="simpleServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="simpleServiceBean" />
        <property name="interceptorNames">
            <list>
                <value>doBeforeMethodBean</value>
            </list>
        </property>
    </bean>
    <bean id="simpleControllerProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="simpleControllerBean" />
        <property name="interceptorNames">
            <list>
                <value>doBeforeMethodBean</value>
            </list>
        </property>
    </bean>
</beans>

它适用于MessageBean的方法,显然它不适用于Controller的方法,因为这个类直接解决,而不是通过它的代理。 那么将AOP应用于Controller的正确方法是什么呢?

1 个答案:

答案 0 :(得分:0)

Spring ApplicationContext是自包含的。

您的@Controller bean正在WebApplicationContext中执行,该ContextLoaderListener是通过您的Web应用程序创建的,可以是DispatcherServletDispatcherServlet(或Spring启动)。

当您发送请求并且@Controller选择helloWorld bean来处理请求时,您的ApplicationContext方法会创建 <bean id="simpleControllerBean" class="com.controller.CMSHelloWorld"> </bean>` ,完全独立于Web应用程序,具有自己的bean。

豆在那里宣布

ApplicationContext

与处理请求的bean完全没有关系。

如果您希望AOP建议应用于处理请求的bean,请在Web应用程序{{1}}中定义您的AOP逻辑。