복붙노트

[SPRING] Spring 3에서 @Aspect와 @Controller를 어떻게 조합 할 수 있습니까?

SPRING

Spring 3에서 @Aspect와 @Controller를 어떻게 조합 할 수 있습니까?

@Controller, 주석 기반 접근 방식을 사용하여 Spring 3 웹 MVC 프로젝트를 설정하려고합니다.

package my.package

@Controller
@RequestMapping("/admin/*")
public class AdminMultiActionController {

@RequestMapping(value = "admin.htm", method = RequestMethod.GET)
public String showAdminSection() {
    return "admin";
}

dispatcher-servlet에는 다음 컨트롤러 처리기가 있습니다.

<context:component-scan base-package="my.package" />
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

webapp은 제공된 maven 아티팩트와 함께 잘 실행됩니다.

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>3.0.2.RELEASE</version>
</dependency>

이제 @AspectJ AOP를 추가하려고합니다. libs있어 :

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.9</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.6.9</version>
</dependency>

내 applicationContext.xml에 추가 :

<aop:aspectj-autoproxy/>

applicationContext.xml에 관련 Bean을 작성했는지 확인하십시오.

<bean id="securityInterceptor" class="my.package.service.SecurityInterceptor"/>

@Aspect를 시작했다.

package my.package.service

@Aspect
public class SecurityInterceptor {

@Pointcut("execution(* showAdminSection(..))")// the pointcut expression
private void foo() {
    System.out.println("fooo");
}// the pointcut signature

이제 이것이 작동을 멈췄습니다. "fooo"는 절대로 인쇄되지 않습니다.

Pointcutted (철자?) 객체가 Spring 관리 빈이어야하고 DefaultAnnotationHandlerMapping과 함께 @Controller가 그렇게 인식되지 않기 때문에 가능합니까?

어떤 도움을 주시면 감사하겠습니다. 정보를 잊어 버린 경우, 질문하십시오. 누군가가 나를 도와 줄 수 있기를 바랍니다.

고마워요!

해결법

  1. ==============================

    1.포인트 컷 메소드는 pointcut을 정의하고, 일치에 대해 호출되지 않으며, 실제로 발생할 일을 정의해야합니다. 예를 들어,

    포인트 컷 메소드는 pointcut을 정의하고, 일치에 대해 호출되지 않으며, 실제로 발생할 일을 정의해야합니다. 예를 들어,

    @Before("foo()")
    public void beforeFoo(JoinPoint joinPoint) {
        System.out.println("foooo");
    }
    
  2. ==============================

    2.아 세상 ... 마침내 그게 효과가있어!

    아 세상 ... 마침내 그게 효과가있어!

    답장을 보내 주셔서 감사합니다.

    호기심에 찬 :

  3. ==============================

    3.두 번째 chzbrgla에 대해 나 (나 같은)를 나중에 보게되면, 컨트롤러 구성 요소 스캐닝과 aop 설정을 디스패처 서블릿으로 이동 한 후 다음과 같이 내 문제가 해결됩니다.

    두 번째 chzbrgla에 대해 나 (나 같은)를 나중에 보게되면, 컨트롤러 구성 요소 스캐닝과 aop 설정을 디스패처 서블릿으로 이동 한 후 다음과 같이 내 문제가 해결됩니다.

    ...
    <context:component-scan base-package="com.mypackage.controller"/>
    <!--  Configure aspects. -->
    <bean id="myAspect1" class="com.mypackage.intercept.SiteAccessAspect"/>
    
    <aop:aspectj-autoproxy proxy-target-class="true">
        <aop:include name="myAspect1" />
    </aop:aspectj-autoproxy>
    ...
    

    보시다시피, 구성 요소 검색은 여전히 ​​내 경우에 효과가있었습니다. Dispatcher 서블릿으로 이동하면 모두 해결됩니다.

    apspect (이 경우 myApect1)는 다음과 같이 구성되었습니다.

    @Pointcut("within(@org.springframework.stereotype.Controller *)")
    public void controller() {}
    
    @Pointcut("execution(* *(..))")
    public void method() {}
    
    @Before("controller() && method()")
    public void doAccessCheck(JoinPoint joinPoint) {
    System.out.println(joinPoint.getSignature()); // For testing purposes.
    }
    
  4. from https://stackoverflow.com/questions/3991249/how-can-i-combine-aspect-with-controller-in-spring-3 by cc-by-sa and MIT license