복붙노트

[SPRING] Spring AOP에서의 프록시 사용

SPRING

Spring AOP에서의 프록시 사용

Spring AOP에서 AspectJ 지원을 활성화하는 방법에 대해 이야기하는 책을 읽었습니다.

다음은 책에서 가져온 단락입니다.

나는 두 번째 단락을 얻을 수 없다. '인터페이스를 사용할 수 없습니다'라는 의미입니다. 누구나 이것을 예를 들어 설명 할 수 있습니까?

해결법

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

    1.Spring AOP는 JDK 동적 프록시 또는 CGLIB를 사용하여 대상 객체에 대한 프록시를 작성합니다.

    Spring AOP는 JDK 동적 프록시 또는 CGLIB를 사용하여 대상 객체에 대한 프록시를 작성합니다.

    Spring 문서에 따르면, 대상이 적어도 하나의 인터페이스를 구현하는 경우 JDK 동적 프록시가 사용됩니다. 그러나 대상 객체가 인터페이스를 구현하지 않으면 CGLIB 프록시가 생성됩니다.

    이것은 CGLIB 프록시를 강제로 생성하는 방법입니다 (set proxy-target-class = "true").

     <aop:config proxy-target-class="true">
        <!-- other beans defined here... -->
     </aop:config>
    

    AspectJ와 autopoxy 지원을 사용할 때 CGLIB 프록시를 강제 할 수도있다. 이것은 가 사용되는 곳이며 "proxy-target-class"가 true로 설정되어야합니다.

    <aop:aspectj-autoproxy proxy-target-class="true"/>
    

    자세한 내용은 Spring 문서가있는 Aspect Oriented Programming의 Proxying Mechanism 섹션을 참조하십시오.

  2. ==============================

    2.Spring은 JDK 프록시를 사용할 수 있기 때문에 AOP 용 인터페이스를 선호한다.

    Spring은 JDK 프록시를 사용할 수 있기 때문에 AOP 용 인터페이스를 선호한다.

    예를 들어 MyService 인터페이스가 있다고 가정 해 보겠습니다.

    public interface MyService {
        void doSomething();
    }
    

    구현 MyServiceImpl

    @Service
    public class MyServiceImpl implements MyService {
        public void doSomething() {
            // does something!
        }
    }
    

    Spring이 MyService의 aspect를 설정했다는 것을 발견하면, MyService를 구현 한 JDK 프록시를 생성 한 다음 모든 호출을 MyServiceImpl bean에 프록시 처리하여 적절한 경우 aspect 기능을 추가한다.

    JDK 프록시는 대상 객체와 동일한 인터페이스를 구현하고 호출을 위임함으로써 작동합니다. 구현할 인터페이스가 없으면 작동하지 않습니다. 위에서와 같은 인터페이스가없는 경우, Spring은 CGLIB와 같은 바이트 코드 라이브러리를 사용하여 런타임에 aspect 기능을 통합하는 클래스를 동적으로 생성해야한다.

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

    3.여기서 AOP, Caching & Transaction이 런타임 프록시 클래스를 사용하여 어떻게 작동하는지 명확하게 설명하는 블로그를 발견했습니다.

    여기서 AOP, Caching & Transaction이 런타임 프록시 클래스를 사용하여 어떻게 작동하는지 명확하게 설명하는 블로그를 발견했습니다.

    인터페이스를 코딩하지 않을 때 (블로그 섹션에서 '빈 클래스가 인터페이스를 구현하지 않으면 어떻게됩니까?') : -

  4. ==============================

    4.Spring AOP는 cross-cutting 관심사 (a.k.a aspect)를 방해하지 않는 방식으로 구현하기위한 메커니즘으로서 프록시를 광범위하게 사용한다. 아이디어는 기본적으로 프락시를 원래의 동작을 풍부하게하는 즉 래퍼 (transaction) 기능을 추가하는 래퍼 (wrapper)로 사용한다.

    Spring AOP는 cross-cutting 관심사 (a.k.a aspect)를 방해하지 않는 방식으로 구현하기위한 메커니즘으로서 프록시를 광범위하게 사용한다. 아이디어는 기본적으로 프락시를 원래의 동작을 풍부하게하는 즉 래퍼 (transaction) 기능을 추가하는 래퍼 (wrapper)로 사용한다.

    이를 달성하기 위해 원래 개체가 인터페이스를 구현하는지 여부에 따라 두 가지 옵션이 있습니다.

    첫 번째 경우 (원래 객체가 적어도 하나의 인터페이스를 구현 함) 리플렉션 API의 동적 프록시 기능을 사용하여 원본 객체 및 따라서 프록시를 대신 사용할 수있는 동일한 인터페이스를 구현하는 프록시 객체를 만듭니다.

    두 번째 경우 (원래의 객체는 어떤 인터페이스도 구현하지 않습니다), 더 정교한 트릭이 사용되어야하며, 이것이 CGLIB가 나타날 때입니다. 프로젝트 페이지에 따르면 "CGLIB는 Java 클래스를 확장하고 런타임에 인터페이스를 구현하는 데 사용됩니다." 따라서이 경우 트릭은 원본 객체를 확장하는 프록시를 작성하므로 대신 사용할 수 있습니다.

  5. from https://stackoverflow.com/questions/8224465/use-of-proxies-in-spring-aop by cc-by-sa and MIT license