2015-02-20 3 views
0

Я пытаюсь изучить 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, поскольку этот класс адресован напрямую, а не через его прокси. Итак, каков правильный способ применения АОП к контроллеру?

+1

Почему у вас есть это в другом 'ApplicationContext', который вы инициализируете ** внутри ** контроллера? Почему ваша часть AOP в веб-приложении «ApplicationContext» не является? –

+0

Я новичок весной, поэтому, боюсь, я не понимаю вашу точку зрения, извините. Не могли бы вы уточнить или указать мне на какой-то учебник, в котором четко указывается правильный путь? –

+0

[Здесь] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/) документация Spring. –

ответ

0

A Весна ApplicationContext автономно.

@Controller Ваш боб выполняется в WebApplicationContext, который был создан с помощью веб-приложения, либо с помощью ContextLoaderListener или DispatcherServlet (или ботинок Spring).

Когда вы отправляете запрос и DispatcherServlet выбирает свой @Controller боб, чтобы справиться с этим, ваш метод helloWorld создает новыйApplicationContext, совершенно не зависит от веб-приложения один, со своими зернами.

боб объявил там

<bean id="simpleControllerBean" class="com.controller.CMSHelloWorld"> 
</bean>` 

не имеет абсолютно никакого отношения к обработке запроса боба.

Если вы хотите, чтобы совет АОП применялся к компоненту, обрабатывающему запрос, определите свою логику AOP в ApplicationContext веб-приложения.

+0

спасибо. я постараюсь понять, как это работает и вернуться. –