에이전트 모드를 배워야 하는 이유는 무엇인가요? 이것은 SpringAOP의 하위 레이어입니다. [SpringAOP 및 SpringMVC]
프록시 모드 분류:
정적 프록시
동적 프록시
역할 분석:
추상 역할: 일반적으로 문제를 해결하기 위해 인터페이스 또는 추상 클래스가 사용됩니다.
1. 인터페이스
public interface Rent { public void rent(); }
//房东 public class Host implements Rent { public void rent() { System.out.println("房东要租房子"); } }
public class Proxy implements Rent{ private Host host; public Proxy() { } public Proxy(Host host) { this.host = host; } public void rent(){ seeHouse(); host.rent(); fare(); } //看房 public void seeHouse(){ System.out.println("中介带你看房"); } //收中介费 public void fare(){ System.out.println("中介收费"); } }
실제 캐릭터의 조작을 더욱 순수하게 만들 수 있습니다! 공무는 신경쓰지 않아도 됩니다
2. 기본 프록시 모델인 AOP에 대한 이해를 심화합니다.
3. 동적 프록시동적 프록시와 정적 프록시의 역할은 동일합니다
public class Client { public static void main(String[] args) { Host host = new Host(); //代理,代理角色一般会有附属操作! Proxy proxy = new Proxy(host); proxy.rent(); } }
실제 문자의 작업을 더욱 순수하게 만들 수 있습니다! 일부 공무는 처리할 필요가 없습니다
//Proxy是生成动态代理类,提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。 //InvocationHandler-- invoke 调用处理程序并返回接口, 是由代理实例的调用处理程序实现的接口 。
loader
2.인터페이스
: 프록시 클래스에 의해 구현된 일부 인터페이스 loader
:类加载器,用于加载代理对象。
2.interfaces
: 被代理类实现的一些接口;
3.h
: 实现了 InvocationHandler
接口的对象;
要实现动态代理的话,还必须需要实现InvocationHandler
来自定义处理逻辑。 当我们的动态代理对象调用一个方法时,这个方法的调用就会被转发到实现InvocationHandler
接口类的 invoke
方法来调用。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h){ }
1.proxy :动态生成的代理类
2.method : 与代理类对象调用的方法相对应
3.args : 当前 method 方法的参数
1、定义接口
public interface InvocationHandler { Object invoke(Object proxy, Method method, Object[] args) throws Throwable; }
2、实现租房的接口
public interface Rent { public void rent(); }
3、定义一个JDK动态代理类
public class Host implements Rent { @Override public void rent() { System.out.println("房东要租房"); } }
invoke()
方法: 当我们的动态代理对象调用原生方法的时候,最终实际上调用到的是 invoke()
方法,然后 invoke()
方法代替我们去调用了被代理对象的原生方法。
4、获取代理对象的工厂类
public class DebugInvocationHandler implements InvocationHandler { /** * 代理类中的真实对象 */ private final Object target; public DebugInvocationHandler(Object target){ this.target = target; } /** * 当你使用代理对象调用方法的时候实际会调用到这个方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //调用方法前 System.out.println("before method" + method.getName()); Object res = method.invoke(target, args); //调用方法后 System.out.println("after method" + method.getName()); return res; } }
getProxy()
:主要通过Proxy.newProxyInstance()
3.
h
: InvocationHandler
인터페이스 개체를 구현했습니다. 동적 프록시를 구현하려면 InvocationHandler
도 구현하여 처리 논리를 사용자 정의해야 합니다. 동적 프록시 객체가 메소드를 호출하면 이 메소드에 대한 호출은 InvocationHandler
인터페이스를 구현하는 클래스의 invoke
메소드로 전달됩니다.
public class JdkProxyFactory { public static Object getProxy(Object target){ return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new DebugInvocationHandler(target) ); } }
1.method: 프록시 클래스 객체가 호출한 메소드에 해당🎜🎜🎜3.🎜args: 현재 메소드 method의 매개변수🎜proxy: 동적으로 생성된 프록시 클래스
2.
public static void main(String[] args) { //Rent rent = new Host(); //Rent rentProxy= (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(),new DebugInvocationHandler(rent)); Rent rentProxy = (Rent)JdkProxyFactory.getProxy(new Host()); rentProxy.rent(); }
invoke()
방법: 동적 프록시 개체가 기본 메서드를 호출할 때 실제로 호출되는 것은 invoke()
메서드이고, 그런 다음 invoke()
메서드는 프록시 개체의 기본 메서드를 호출합니다. 우리를 대신해. 🎜🎜4. 프록시 객체의 팩토리 클래스 얻기🎜rrreee🎜getProxy()
: 주로 Proxy.newProxyInstance()
메서드를 통해 특정 클래스의 프록시 객체를 얻습니다. 🎜🎜5. 🎜rrreee🎜🎜🎜🎜🎜🎜before methodrent🎜집주인이 집을 임대하고 싶어🎜after methodrent🎜🎜를 사용하여 실제로 위 에이전트를 실행한 결과위 내용은 Java의 동적 프록시 및 정적 프록시 분석 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!