설명 : 동적 프록시는 실행시 동적으로 생성 된 프록시 클래스에서 의미합니다. 즉, 프록시 클래스의 바이트 코드가 생성되고 현재의 클래스 로더는 런타임에로드. 정적 프록시 클래스에 비해 많은 이점이있다. 너무 많은 인터페이스, 그것은 프록시 인터페이스를 많이 될 것입니다 경우, 실제 테마와 정확히 같은 클래스 정식 패키지를 쓸 필요는, 인터페이스는 약간 변경, 프록시 인터페이스이 변경되어야한다 둘째, 동적 프록시의 사용은 런타임에 프록시 클래스를 지정할 수 있습니다 실행 로직하여 시스템의 유연성을 향상.
에이전트는 동적 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를 (); 반환 개체 ; } }
응용 예를 절전 동적 프록시의 가장 고전 프록시 모드를 사용하는 것이다 : 지연 특성 로딩 한 상기 제 부하에게 연관된 테이블을 지연된다.