프로그래밍 최적화 - 동적 에이전트 (2)의 프록시 모드

  설명 : 동적 프록시는 실행시 동적으로 생성 된 프록시 클래스에서 의미합니다. 즉, 프록시 클래스의 바이트 코드가 생성되고 현재의 클래스 로더는 런타임에로드. 정적 프록시 클래스에 비해 많은 이점이있다. 너무 많은 인터페이스, 그것은 프록시 인터페이스를 많이 될 것입니다 경우, 실제 테마와 정확히 같은 클래스 정식 패키지를 쓸 필요는, 인터페이스는 약간 변경, 프록시 인터페이스이 변경되어야한다 둘째, 동적 프록시의 사용은 런타임에 프록시 클래스를 지정할 수 있습니다 실행 로직하여 시스템의 유연성을 향상.

  에이전트는 동적 J가 DK 자신의 동적 프록시, CGLIB,와 Javassist 또는 ASM 라이브러리를 . 내장 된 JDK JDK 동적 프록시 단순하고, 그래서 타사 항아리 패키지를 도입 할 필요가 없습니다,하지만 기능은 약하다. CGLIB와와 Javassist는 전반적인 성능은 JDK보다 더 나은, 그리고 강력한 함께 제공 수석 바이트 코드 생성 라이브러리입니다. 이 CGLIB의 사용을 소개합니다

 

1. pom.xml 파일에 CGLIB 받는다는 프로젝트 구성의 도입

    <의존성> 
        <의 groupId> CGLIB </의 groupId> 
        <artifactId를> CGLIB </ artifactId를> 
        <version>은 2.2 . 2 </ 버전> 
    </ 의존성>

 

 2. 인터페이스의 테마

    com.hxc.proxy.proxyMode 패키지; 
    
    / * * 
     * <P> 설명 : 주제 인터페이스 </ P> 
     * @author 황 Xiaocong 
     * 2천19년 @data 날짜가 27 일 10 
     * / 
    공용  인터페이스 IDBQuery { 
        문자열 요청 (); 
    }

 

3. 진정한 주제

    대한 com.hxc.proxy.proxyMode 패키지 페널티;
     / * * 
     * <ρ-> 설명 : 실제 테마 </ ρ-> 
     * @author 황 Xiaocong 
     * @data 2019 니안 (10) 왕위 27 리 
     * / 
    공용  클래스 DBQuery 구현 IDBQuery { 
    
        공공 DBQuery () {
             은 try { 
                에 Thread.sleep ( 1000 );     // 시뮬레이션 실행 
            } 캐치 (예외 : InterruptedException E) { 
                e.printStackTrace (); 
            } 
        } 
        공공 문자열 요청 () {
             반환  " 요청 문자열 "  ;
        }
    
    }

 

4. 프록시 클래스 CGLIB 프록시 클래스 구현 의 MethodInterceptor 인터페이스 (JDK 동적 프록시 들고 구현 의 InvocationHandler의 인터페이스)

패키지 com.hxc.proxy.proxyMode; 

수입 java.lang.reflect.Method의; 

수입 net.sf.cglib.proxy.MethodInterceptor; 
수입 net.sf.cglib.proxy.MethodProxy; 

/ * * 
 * <p> 설명 :代理类</ p> 
 * @author 황 Xiaocong 
 * 2019年10月日@data 30 
 * / 
공용  클래스 CglibDbQueryInterceptor이 구현 의 MethodInterceptor  { 

    개인 IDBQuery = 실제 는 null ;
    공용 개체 인터셉트 (오브젝트 OBJ 방법에있어서, 오브젝트 [] args를 MethodProxy 프록시)의 Throwable {발생
         하는 경우 (실제의 == ) { 
            실제 = 새로운DBQuery (); 
        } 
        반환 실제; 
    } 

}

 

5.Main는 작업과 테마 프록시 클래스의 인터페이스를 완료

  프록시 개체의 단계를 만들기 :

  1) 논리 지정된 컷, 프록시 클래스 정의

  2) 특정 인터페이스 구현

  3) 생성 된 프록시 클래스의 예

    패키지 com.hxc.proxy.proxyMode; 
수입 net.sf.cglib.proxy.Enhancer; 

/ * * 
     * <p> 설명 :客户端</ p> 
     * @author 황 Xiaocong 
     * 2,019 @data年10月日27 
     * / 
    공용  클래스 주요 { 
        
        공공  정적  무효 메인 (문자열 []에 args) { 
            IDBQuery dbQuery = createCglibProxy (); 
            문자열 요청 = dbQuery.request (); 
            체계. 아웃 .println (요청); 
        } 
        
        공용  정적 IDBQuery createCglibProxy는 () { 
            향상제 향상 = 새로운확장기 (); 
            enhance.setCallback ( 새로운 새 CglibDbQueryInterceptor ());      // 지정된 잘라 논리 프록시 클래스 정의
             // 특정 인터페이스 구현 
            enhance.setInterfaces ( 새로운 새로운 클래스 [{IDBQuery. 클래스 });
             // 생성 된 프록시 클래스 예로 
            IDBQuery 개체 = (IDBQuery) enhance.create를 ();
             반환  개체 ; 
        } 
    
    }

 

  응용 예를 절전 동적 프록시의 가장 고전 프록시 모드를 사용하는 것이다 : 지연 특성 로딩 한 상기 제 부하에게 연관된 테이블을 지연된다.

 

추천

출처www.cnblogs.com/sun-flower1314/p/11748056.html