我正在尝试学习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的正确方法是什么呢?
答案 0 :(得分:0)
Spring ApplicationContext
是自包含的。
您的@Controller
bean正在WebApplicationContext
中执行,该ContextLoaderListener
是通过您的Web应用程序创建的,可以是DispatcherServlet
或DispatcherServlet
(或Spring启动)。
当您发送请求并且@Controller
选择helloWorld
bean来处理请求时,您的ApplicationContext
方法会创建新 <bean id="simpleControllerBean" class="com.controller.CMSHelloWorld">
</bean>`
,完全独立于Web应用程序,具有自己的bean。
豆在那里宣布
ApplicationContext
与处理请求的bean完全没有关系。
如果您希望AOP建议应用于处理请求的bean,请在Web应用程序{{1}}中定义您的AOP逻辑。