복붙노트

[SPRING] 원래의 인터페이스는 Spring AOP 소개에서 사라졌습니다.

SPRING

원래의 인터페이스는 Spring AOP 소개에서 사라졌습니다.

다음은 Spring AOP 설정이다.

<bean id="myObject" class="com.madzone.learn.spring.aop.OriginalClass"></bean>
<bean id="aspect" class="com.madzone.learn.spring.aop.AspectClass"></bean>
<aop:config>
    <aop:aspect ref="aspect">
        <aop:declare-parents
            types-matching="com.madzone.learn.spring.aop.OriginalClass+"
            implement-interface="com.madzone.learn.spring.aop.IntroducedInterface"
            default-impl="com.madzone.learn.spring.aop.IntroducedInterfaceImpl" />
    </aop:aspect>
ApplicationContext context = new ClassPathXmlApplicationContext("myApp.xml");
Object myObject = context.getBean("myObject");
if (myObject instanceof OriginalClass) {
    System.out.println("This is OriginalClass");
}
if(myObject instanceof IntroducedInterface) {
    System.out.println("This is IntroducedInterface");
}

이 소개를 통해 IntroducedInterface의 메소드를 호출 할 수있었습니다. 그러나 OriginalClass의 메소드에 액세스 할 수 없었습니다. 위의 코드 스 니펫에서는 'This is OriginalClass'가 출력되지 않습니다.

'소개'의 정의에서 나는 새로운 인터페이스를 구현하는 프록시가 OriginalClass에서 확장되어 그 메소드를 액세스 할 수있게한다는 것을 이해했습니다.

내가 여기서 뭔가를 놓치고 있니? 누군가 이유를 설명 할 수 있습니까?

추신:   다음은이를 묘사하는 Spring in Action (3 판)의 그림입니다.

해결법

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

    1.나는 그 인상을 어디에서 얻었는지 잘 모르겠습니다. 모든 Spring AOP는 기본적으로 인터페이스에서만 작동하는 JDK 동적 프록시에 내장되어 있습니다. 구체적인 클래스를 프록시 화하는 것은 불가능합니다. 대신 클래스를 대신하기 위해 CGLIB 프록시를 사용하기위한 Spring의 지원이 있지만, 커플 링을 줄이기 위해 인터페이스 프로그래밍을 선호하는 참조 가이드는 사용하지 않는 것이 좋습니다.

    나는 그 인상을 어디에서 얻었는지 잘 모르겠습니다. 모든 Spring AOP는 기본적으로 인터페이스에서만 작동하는 JDK 동적 프록시에 내장되어 있습니다. 구체적인 클래스를 프록시 화하는 것은 불가능합니다. 대신 클래스를 대신하기 위해 CGLIB 프록시를 사용하기위한 Spring의 지원이 있지만, 커플 링을 줄이기 위해 인터페이스 프로그래밍을 선호하는 참조 가이드는 사용하지 않는 것이 좋습니다.

  2. from https://stackoverflow.com/questions/14089642/original-interface-is-lost-in-spring-aop-introduction by cc-by-sa and MIT license