2012-01-19 3 views
3

동일한 클래스에있는 메서드간에 메서드 호출을 만들고 트랜잭션에 대한 조언을 적용하는 데 문제가 있습니다.AoP에서 순수 상속 기반 프록시가 올바르지 않은 이유

스프링 프레임 워크. NET 설명서는 구성 및 상속 기반 프록시를 지원하며 스프링이 상속 기반 프록시 (대상이없는 프록시)를 인스턴스화하도록 만들 수 있음을 명시합니다.

그러나 '상속 기반 프록시'조차도 주장하는 바가 아닙니다. 그것들은 인터페이스가 아닌 목표 클래스를 상속 받지만 여전히 대상 객체를 사용합니다. 이것은 같은 클래스의 advice 사이의 call이 적용되지 않는다는 사실로 이어진다.

틀림없이 Spring은 InheritanceBasedAopConfigurer을 사용하여 약간의 노력으로이를 수행 할 수 있지만 여전히 적용 할 개체와 적용 할 조언을 나열해야합니다.

왜 실제 상속 기반 프록시를 피하기 위해 스프링이 농구를 뛰어 넘고 있습니까? 어떤 반 패턴이 빠졌습니까?

답변

3

나는 여러 가지 이유를 볼 수 있습니다

1) 구현 더 복잡합니다. IoC 컨테이너가 인스턴스를 관리하고 순수 상속 기반 프록시를 적용하려면 해당 유형에 대해 작업해야합니다. 이것이 'InheritanceBasedAopConfigurer'가하는 일입니다. 컨테이너를 초기화하기 전에 유형을 변경합니다.

2) AOP를 작동 시키려면 가상으로 표시해야합니다. 직관적이지 않습니다.

3) 컴포지션 기반 프록시는 인터페이스별로 디자인을 적용하는 것이 좋습니다.

+0

1)과 2)에 관해서 : spring.net 팀은 .net에 사용할 수있는 AspectJ와 유사한 라이브러리가 있었으면 다른 선택을했을까요? 또는 Java (기본적으로 "가상")와 .net (기본 가상이 아님) 간의 근본적인 차이점은 무엇입니까? – Marijn

+1

근본적인 차이점은 정적 위버 인 AspectJ입니다. .NET 용 스프링에는 역동적 인 위버 만 있습니다. InheritanceBasedAopConfigurer에는 Java에서 이에 상응하는 것이 없으며 Windows Forms와 같은 일부 특수한 경우에는 AOP를 적용하기 위해 추가되었습니다. – bbaia

+0

통찰력을 가져 주셔서 감사합니다. 구현이 더 복잡 할 수도 있지만 이미 구현되어 있으므로 상속 프록시가 실제로 적용되지 않는 이유를 궁금해 할 것입니다. 인터페이스 디자인과 클래스 디자인은 상속과 컴포지션 기반의 프록 싱에 아무런 차이가 없으며, 어떤 클래스에 접근하더라도 여전히 같은 클래스 내의 메소드 호출에는 적용되지 않을 것입니다. 내 관점에서 볼 때 이것은 수치 스럽다.하지만 나는 그것이 왜 그렇게 행동해야하는지 반성을 듣고 기꺼이 듣겠지만. –