2012-04-08 3 views
0

다음 http://java.sun.com/developer/technicalArticles/JavaLP/Interposing/일 설명

그리고에 다음의 설명을 참조하십시오 끼워 :

클래스로드시에

의 개재 클래스는 원래 전에 발견되어야합니다 ... 중간 배치 클래스는 있어야합니다 원래의 전체 이름은 입니다. 예를 들어, 클래스 Foo는 패키지 pub.foo 에 있고 패키지 pub.bar에서 클래스 Bar의 인스턴스를 만들 수 있습니다. 파일 bar.java를 fake/pub/bar와 같은 다른 디렉토리에 만들고 을 classpath 앞에/fake로 만들면 JVM이 원본이 아닌 pub.bar.Bar 클래스의 정의를로드합니다. 이런 식으로 우리는 바의 방법에 대한 우리의 정의를 원본 위에 삽입 할 수 있습니다.

다음 예에서 Bar.java는 개체가 삽입되는 인터페이스입니다.

위의 인용문에서 Sun이 어떤 사용 사례를 설명하는지 이해할 수 없습니다. 구체적인 의문점 : 1. 원래 수업이 언급 된 것은 무엇입니까? 2. 어떤 경우에는 내 자신의 가짜/pub.bar.Bar가 있어야하고 원본을 사용하지 않아야합니다 (원래의 의미를 올바르게 해석 한 경우를 대비하여). 가능한 경우 예를 들어 설명해주십시오. CGLIB 및 런타임 프록시 : advane

답변

0

에서

덕분에 나는 당신이 프록시를 생성하는 두 가지 방법을 혼합하고 생각합니다. 첫 번째 클래스는 클래스가로드되는 동안 프록시를 만들고 두 번째 클래스는 런타임에서 이름을 나타내는대로 프록시를 만듭니다. 그것들은 둘 다 객체 주위에 투명한 프록시를 만드는 것과 같은 방식이지만 객체 간에는 상당한 차이가 있습니다. 예를 들어 CGlib은 클래스가 final이 아니며 기본 생성자를 갖도록 요구합니다. 또는 다음 예제를 고려해 보겠습니다. 의 당신이 서비스를 MyService 있다고 가정 해 봅시다 :

public class MyService { 
    @Transactional 
    public void proxifiedMethod(){ 
     // some logic here  
    } 

    public void pureMethod(){ 
     // some logic here... 
     proxifiedMethod(); 
     // ...and here 
    } 
} 

이의 당신이 트랜잭션 내에서 실행 proxifiedMethod이 필요하고 당신이 @Transactional 주석을 사용하는 프레임 워크에 대한 힌트를 제공한다고 가정 해 봅시다. 프레임 워크 (스프링이라고 가정 해 봅시다)가 런타임 프록시를 사용하도록 고안된 경우 pureMethod에서 호출 된 proxifiedMethod에 대한 트랜잭션은 CGLib의 경우 생성되지 않습니다.

귀하의 질문에 응답 :

  1. 원래 클래스는 프록시 객체가 생성되는 인스턴스 주위 클래스입니다.

  2. 당신이 말하는 런타임 프록시는 트랜잭션이나 보안과 같이 cross-cutting concerns과 같이 Java 엔터프라이즈 세계에서 널리 사용됩니다. 일반적으로 수동 트랜잭션 관리로 코드를 엉망으로 만들고 싶지는 않습니다. 이는 Spring과 같은 프레임 워크 또는 JBoss와 같은 애플리케이션 컨테이너로 수행되는 작업입니다. 따라서 @Transactional 주석과 같은 메타 정보를 추가하면 프레임 워크는 트랜잭션 관리 로직을 처리하기 위해 주석 첨부 서비스 주변에 프록시를 만듭니다.

+0

감사합니다. 의심스러운 부분을 틀린 제목으로 게시 한 것은 나쁘다 (현재 변경됨). 나는 계속해서 기사를 읽었으며 이제는 클래스 적재와 관련하여 의구심을 갖고 있습니다. Proxy 클래스가 실제 클래스보다 먼저로드되어야한다고하는 이유는 무엇입니까?원래의 것보다 먼저 사용되기 때문입니다. 또한 newProxyInstance 메소드에 클래스 로더를 제공하는 중요성은 무엇입니까? 다시 한번 감사드립니다. – Mustafa