2010-07-22 18 views
19

Açıklamalı bir kontrolörden sonra bazı işlemleri yapmak için AOP'yi kullanmaya çalışıyorum. Her şey hatasız çalışıyor, ancak tavsiye edilmiyor.Yay AOP Açıklamalar Açıklamalı Kontrol Cihazları Hakkında Öneriler

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

ve uygulama yapılandırma

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

kurulum ve gerçek danışma

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!"); 
    } 
} 

o tavsiyelerde olması bile mümkün mü: Burada

kontrolör kodudur açıklamalı kontrolörler? 2.5 numaralı baharı kullanıyorum.

+0

Hiç bu işe yaramadı ve maalesef, üzerinde çalışabilmek için zamanım tükendi. Şimdilik sadece kodu kopyalamakla uğraşmak zorundayım. – jdana

+0

"TestAdvisor" fasulyenizi 'türünde şu şekilde eklemelisiniz: ' – xli

cevap

1

MVC denetleyicileri için, yapmaya çalıştığınız şeyi gerçekleştirmenin tercih edilen yöntemi, önleyici kullanmaktır. Bkz. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor

+6

Katılmıyorum. Unsurlar aynı şeyi elde etmek için tartışmalı olarak daha zarif bir yoldur. – skaffman

+1

Genel kuralım, belirli web isteklerini engellemek istediğinizde engelleyicileri kullanmaktır. Normal bahar fasulyelerindeki yöntemlere müdahale etmek istediğinizde Unsurları kullanın. Soru, Kontrolörlerin (web istekleri ile eşleştirilen) yakalanması ile ilgili olduğundan, ara kesiciler kullanmak daha uygundur. – Sasi

+0

ara önleyiciler genelde korkunç. URI'ları önemseyen kim? Hangi kontrolörlerin hangi mantık parçalarını uygulayacağını tam olarak açıklamak istiyorum. Konuyla ilgili ek açıklamalar, bunu yapmanın tek yoludur. – Alex

22

Açıklamalı kontrolörler hakkında tavsiye almak mümkündür.

@Controller ile açıklanmış tüm sınıflardaki tüm yöntemlerin uygulanmasından sonra tavsiye almak istediğinizi varsayalım.

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

Not: Eğer AspectJ'yi sözdizimi ile Bahar AOP kullanmak istiyorsanız

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.."); 
    } 
} 

, ayrıca böyle bir yapılandırma dosyası gerekir: Burada

bir örnek Spring AOP ile, Bahar konteyner sadece bahar fasulyelerini örter. @Controller nesnesi bir Spring Bean değilse, AspectJ dokumasını kullanmanız gerekir.

+0

@Controller'ın bir fasülye olup olmadığını nasıl anlarım?Bağımlılıkları @Outowired aracılığıyla doğru bir şekilde aldığını biliyorum, bu yüzden bir fasulye olduğunu düşündüm, ancak hala uygulama yapma konusunda problem yaşıyorum. – jdana

+1

Otomatik kablolama çalışıyorsa ve ilkbahardan başka bir IOC kabına sahip değilseniz, o zaman bir Spring fasülyesidir. – Espen

+1

Diğer bileşenlerim düzgün çalışıyor ancak kontrolörler için şans yok. Aynı özellik sınıfında, denetleyici nokta kesimlerini ve ayrıca hizmet noktalarını tanımlarım. Servis pointcuts çalışır ama denetleyicileri değil. Bunun neden olduğu hakkında bir ipucu var mı? –

2

Deposu için tavsiyenin çalıştığı yerde aynı problemi yaşadım, ancak Kontrolör için tavsiye yoktu. Sonunda bir çözüm buldum. Kısacası, AOP tanımınızın farklı bir bağlam değil, Servlet bağlamında yüklü olduğundan emin olmanız gerekir.

Benim durumumda, Spring AOP tanımım tools-config.xml'da tanımlanmıştır. buradan buraya

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>classpath:spring/tools-config.xml</param-value> 
</context-param> 

<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

,

<servlet> 
    <servlet-name>petclinic</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath:spring/mvc-core-config.xml, classpath:spring/tools-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

taşımayı sonra Kontrolörü için tavsiye çalışıyor.

+0

Her şey açıklamalarla ve AOP yapılandırması için xml dosyası yoksa ne olur? – Dish