Я пытаюсь изучить Spring AOP, и, как я понимаю, он работает через прокси, и можно применять аспекты только к beans, работая с прокси, а не напрямую с beans. Так что яSpring AOP для классов non-beans
@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
}
Также у меня есть очень простой боб:
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
, поскольку этот класс адресован напрямую, а не через его прокси. Итак, каков правильный способ применения АОП к контроллеру?
Почему у вас есть это в другом 'ApplicationContext', который вы инициализируете ** внутри ** контроллера? Почему ваша часть AOP в веб-приложении «ApplicationContext» не является? –
Я новичок весной, поэтому, боюсь, я не понимаю вашу точку зрения, извините. Не могли бы вы уточнить или указать мне на какой-то учебник, в котором четко указывается правильный путь? –
[Здесь] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/) документация Spring. –