복붙노트

[SPRING] AOP의 Advisor와 Aspect의 차이점은 무엇입니까?

SPRING

AOP의 Advisor와 Aspect의 차이점은 무엇입니까?

나는 Spring AOP가 처음이다. 필자는 이해를 바탕으로 Advisor (예 : DefaultPointcutAdvisor)와 Aspect (예 : @Aspect로 주석 된 클래스)가 메소드 호출시 더 많은 작업을 수행하여 교차 절단 문제를 해결하는 데 도움이 될 수 있음을 확인했습니다.

이 두 학기 사이에 다른 점은 무엇입니까?

해결법

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

    1.조언은 Pointcut에서 작업을 수행하는 방법입니다. 사전, 후 또는 심지어 주위의 조언을 사용하여 정의한 모든 동작을 적용 할 수 있습니다. 스프링 애스펙트에 대해 말하면서, 그것은 높은 레벨이고 두 가지 개념, 즉 중점과 조언을 병합하는 클래스 일뿐입니다. XML 기반 청사진을 통해 또는 프로그래밍 방식으로 수행 할 수 있습니다. 또한 aspect를 연결하고자하는 지점을 지정해야하며, Jointpoint를 사용하여 수행됩니다.

    조언은 Pointcut에서 작업을 수행하는 방법입니다. 사전, 후 또는 심지어 주위의 조언을 사용하여 정의한 모든 동작을 적용 할 수 있습니다. 스프링 애스펙트에 대해 말하면서, 그것은 높은 레벨이고 두 가지 개념, 즉 중점과 조언을 병합하는 클래스 일뿐입니다. XML 기반 청사진을 통해 또는 프로그래밍 방식으로 수행 할 수 있습니다. 또한 aspect를 연결하고자하는 지점을 지정해야하며, Jointpoint를 사용하여 수행됩니다.

    Aspects는 합동 점 및 조언을 위해서만 합병되기 때문에 Spring 측면과 Advice는 서로 대체 할 수 없습니다.

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

    2.대부분의 측면은 다음을 정의하는 조언의 조합입니다. aspect의 행동과 aspect가 실행되어야하는 곳을 정의하는 pointcut.

    대부분의 측면은 다음을 정의하는 조언의 조합입니다. aspect의 행동과 aspect가 실행되어야하는 곳을 정의하는 pointcut.

    Spring은이를 인식하고 조언과 포인트 컷을 결합한 어드바이저를 제공한다. 하나의 객체로.

    좀 더 구체적으로, PointcutAdvisor가이를 수행합니다.

    public interface PointcutAdvisor {
       Pointcut getPointcut();
       Advice getAdvice();
    }
    

    Spring의 내장 된 pointcut에는 대부분 PointcutAdvisor가있다. 이것은 pointcut과 그것이 관리하고있는 advice를 정의하고 싶을 때 편리하다. 한 곳에서.

    Spring in Action, 3rd Edition 더보기

    스냅 샷

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

    3.제 생각에 Aspect는 Aspect Oriented Programming 전문 용어이고 Advisor는 Spring Framework 전문 용어입니다.

    제 생각에 Aspect는 Aspect Oriented Programming 전문 용어이고 Advisor는 Spring Framework 전문 용어입니다.

    아마이 간단한 예제가 도움이 될 것입니다 :

    Foo.java

    public interface Foo {
        void foo();
        void baz();
    }
    

    FooImpl.java

    public class FooImpl implements Foo {
        @Override
        public void foo() {
            System.out.println("Foo!");
        }
    
        @Override
        public void baz() {
            System.out.println("Baz!");
        }
    }
    

    MethodBeforeAdviceBarImpl.java

    import org.springframework.aop.MethodBeforeAdvice;
    
    import java.lang.reflect.Method;
    
    public class MethodBeforeAdviceBarImpl implements MethodBeforeAdvice {
        @Override
        public void before(Method method, Object[] args, Object target) throws Throwable {
            System.out.println("Bar!");
        }
    }
    

    마지막으로 App.java

    import org.springframework.aop.MethodBeforeAdvice;
    import org.springframework.aop.framework.ProxyFactory;
    import org.springframework.aop.support.NameMatchMethodPointcutAdvisor;
    
    public class App {
    
        public static void main(String[] args) {
            final MethodBeforeAdvice advice = new MethodBeforeAdviceBarImpl();
    
            final NameMatchMethodPointcutAdvisor nameMatchMethodPointcutAdvisor = new NameMatchMethodPointcutAdvisor();
            nameMatchMethodPointcutAdvisor.setMappedName("foo");
            nameMatchMethodPointcutAdvisor.setAdvice(advice);
    
            final ProxyFactory proxyFactory = new ProxyFactory();
            proxyFactory.addAdvisor(nameMatchMethodPointcutAdvisor);
    
            final Foo foo = new FooImpl();
            proxyFactory.setTarget(foo);
    
            final Foo fooProxy = (Foo) proxyFactory.getProxy();
            fooProxy.foo();
            fooProxy.baz();
        }
    }
    

    App.java에서 main 메소드를 실행하면 다음과 같이 출력됩니다.

    Bar!
    Foo!
    Baz!
    

    그래서 여기에서 볼 수 있듯이 NameMatchMethodPointcutAdvisor는 Advisor이며,이 경우는 pointcut 및 Advice 자체 인 mappedName으로 구성되며이 경우 MethodBeforeAdvice입니다.

    그리고 Aspect Oriented Programming 전문 용어에서, Aspect는 Advice + Pointcut이기 때문에 거기에 ... Advisor는 결국 Aspect가되는 것 같습니다.

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

    4.어드바이저는 Java 5 사용이 다소 드물어서 Spring에서 사용되지 않는 @AspectJ 구문 (Java 주석을 통해)이 사용되지 않았을 때 Spring 1.2에서 교차 절단 문제를 정의하는 오래된 "AOPlite"유형 인 것으로 보입니다. 이 개념은 주석 기반 AOP 또는 순수 AspectJ 구문보다는 스키마 기반 AOP를 좋아하는 사람들을 위해 여전히 살아있다. 고문에 대한 Spring 문서를 참조한다.

    어드바이저는 Java 5 사용이 다소 드물어서 Spring에서 사용되지 않는 @AspectJ 구문 (Java 주석을 통해)이 사용되지 않았을 때 Spring 1.2에서 교차 절단 문제를 정의하는 오래된 "AOPlite"유형 인 것으로 보입니다. 이 개념은 주석 기반 AOP 또는 순수 AspectJ 구문보다는 스키마 기반 AOP를 좋아하는 사람들을 위해 여전히 살아있다. 고문에 대한 Spring 문서를 참조한다.

  5. from https://stackoverflow.com/questions/25092302/what-is-the-difference-between-advisor-and-aspect-in-aop by cc-by-sa and MIT license