동적 프록시 구현
사용 된 모드 : 프록시 모드.
프록시 모드의 기능은 다른 객체 가이 객체에 대한 액세스를 제어 할 수있는 프록시를 제공하는 것입니다. 임대 대행사와 유사합니다.
두 가지 동적 프록시 :
(1) JDK 동적 프록시. JDK 동적 프록시는 Java 내부의 반사 메커니즘에 의해 구현됩니다. 대상 클래스는 Unified Interface (invocationHandler)를 기반으로합니다.
(2) CGLIB 동적 프록시 및 CGLIB 동적 프록시의 기본 층은 ASM의 도움으로 구현됩니다. CGLIB와 같은 타사 라이브러리에서 구현 한 동적 프록시는보다 널리 사용되며 효율성에 더 많은 장점이 있습니다.
주요 응용 프로그램 프레임 워크 :
봄의 AOP, Struts2의 인터셉터
특정 구현 :
1. 인터페이스를 정의하고 클래스를 구현하십시오
package com.example.service; public interface userservice {public String getName (int id); 공개 정수 getage (int id);} package com.example.service.impl; import com.example.service.userService; public class usererviceimpl emperservice {public string getName (int id) {system.out.println ( "------ getName -----"); "고양이"를 반환합니다. } public integer getage (int id) {system.out.println ( "------ getage -----"); 반환 10; }}2. JDK 동적 프록시 구현
package com.example.jdk; import java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; public class myInvocationHandler는 invoctionHandler {private 객체 대상; / ** * 대의원 객체를 바인딩하고 프록시 클래스를 반환 * * @param target * @return */ public object bind (개체 대상) {this.target = target; // 프록시 개체를 가져옵니다. proxy.newproxyInstance (target.getClass (). getClassLoader (), target.getClass (). getInterfaces (), this); // 인터페이스를 바인딩하기 위해 (이것은 결함입니다. CGLIB는이 결함을 보충합니다)} @Override public object invoke (오브젝트 프록시, 메소드 메소드, 개체 [] args) 던지기 가능 {if ( "getName".GetName ()))) {System.out.println ( "------------------------------------------ 객체 결과 = method.invoke (target, args); System.out.println ( "------ 이후" + method.getName () + "------"); 반환 결과; } else {object result = method.invoke (target, args); 반환 결과; }}} package com.example.jdk; import com.example.service.userService; import com.example.service.impl.userserviceimpl;/*** 테스트 클래스*/public static void main (string [] args) {myinvociationHandler proxy = new myInvocationHandler (); uservice usererviceproxy = (userService) proxy.bind (new UserserViceImpl ()); System.out.println (usererviceproxy.getName (1)); System.out.println (usererviceproxy.getage (1)); }}실행 결과 :
------ GetName 전 ----
------ getName ----
------ GetName 이후 -----
고양이
----- getage -----
10
3. CGLIB 동적 프록시 구현 :
JDK의 동적 프록시 메커니즘은 인터페이스를 구현하는 클래스 만 프록시 할 수 있지만 인터페이스를 구현할 수없는 클래스는 JDK의 동적 프록시를 구현할 수 없습니다. CGLIB는 클래스의 프록시를 구현합니다. 원칙은 지정된 대상 클래스에 대한 서브 클래스를 생성하고 메소드 구현 향상을 덮어 쓰는 것입니다. 그러나 상속이 사용되기 때문에 Final이 수정 한 클래스는 근접 할 수 없습니다.
CGLIB의 핵심 클래스 :
net.sf.cglib.proxy.enhancer 메인 강화 클래스
net.sf.cglib.proxy.methodinterceptor 기본 메소드는 클래스를 가로 채며, 이는 콜백 인터페이스의 하위 인터페이스이며 사용자 구현이 필요합니다.
net.sf.cglib.proxy.methodproxy Java.lang.reflect.method 클래스의 프록시 클래스는 소스 객체 메소드에 호출을 쉽게 구현할 수 있습니다.
net.sf.cglib.proxy.methodinterceptor 인터페이스는 가장 일반적인 콜백 유형이며 프록시 기반 AOP에서 인터셉트 메소드 호출을 구현하는 데 종종 사용됩니다. 이 인터페이스는 하나의 메소드 만 정의합니다
공개 객체 인터셉트 (Object Object, java.lang.reflect.method 메서드,
Object [] Args, MethodProxy Proxy) 던지기 가능;
첫 번째 매개 변수는 프록시 객체이고, 두 번째 및 세 번째 매개 변수는 각각 가로 채는 방법과 방법의 매개 변수입니다. 원래 메소드는 java.lang.reflect.method 객체를 사용하여 일반적인 반사 호출을 사용하거나 net.sf.cglib.proxy.methodproxy 객체를 사용하여 호출 할 수 있습니다. net.sf.cglib.proxy.methodproxy는 일반적으로 더 빠르기 때문에 선호됩니다.
package com.example.cglib; import org.springframework.cglib.proxy.enhancer; import org.springframework.cglib.proxy.methodinterceptor; import org.springframework.cglib.proxy.methodproxy; import java.lang.rang.methercector inggliproxy emprocector em problicector rements inglice 개인 객체 목표; / ** * 프록시 개체 생성 * * @param target * @return */ public object getInstance (객체 대상) {this.target = target; Enhancer Enhancer = New Enhancer (); Enhancer.setSuperClass (this.target.getClass ()); // 콜백 메소드 Enhancer.setCallback (this); // 프록시 객체 작성 return Enhancer.create (); } @Override public Object Intercept (Object O, Method Method, Objects, MethodProxy MethodProxy) 던지기 가능 {System.out.println ( "+MethodProxy.getSuperName ()+"++++++ "); System.out.println (Method.getName ()); 객체 결과 = MethodProxy.invokesuper (O, Objects); System.out.println ( "++++++"+MethodProxy.getSuperName ()+"++++++++"); 반환 결과; }} package com.example.cglib; import com.example.service.userservice; import com.example.service.impl.userserviceimpl;/** * 테스트 cglib */public static void main (string [] args) {cglibproxy cglibproxy = new cglibproxy (); userVice userErvice = (userService) cglibproxy.getInstance (new UserserViceImpl ()); userervice.getName (1); userervice.getage (1); }}실행 결과 :
cglib $ getName 이전 +++++++ 이상 $ 0 ++++++++
getName
------ getName ----
cglib $ getName 이후 +++++++. $ 0 ++++++++
cglib $ 이전의 ++++++ 이상 $ 1 ++++++++
getage
----- getage -----
cglib $ getage 후 +++++++ $ 1 ++++++++
위는이 기사의 모든 내용입니다. 이 기사의 내용이 모든 사람의 연구 나 업무에 도움이되기를 바랍니다. 또한 wulin.com을 더 지원하기를 바랍니다!