简介
Proxy代理模式是一种结构型设计模式,作用是避免对象直接被访问
java中代理技术主要用于扩展功能又修改源代码
静态代理
代理类和委托类都实现同一个接口,静态代理中在编译的时候就确定了
代理类和接口实现类的区别
委托类的方法必须和代理类的方法一致,调用代理类就像调用委托类一样
静态代理的缺点
一个真实角色就会产生一个代理角色,代码量会翻倍,开发效率变低。动态代理可以很好解决
动态代理
依靠反射实现,在运行时才能动态创建成
动态代理涉及两个类java.lang.reflect.proxy
和java.lang.reflect.invocationHandler
,前者是创建动态代理类,后者是处理实例,并返回结果
package com.example.webdemo01.demo;
interface Rent {
public void rent();
}
package com.example.webdemo01.demo;
public class Host implements Rent{
@Override
public void rent() {
System.out.println("出租房子");
}
}
package com.example.webdemo01.demo;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
private Object obj;
public void setObj(Object obj) {
this.obj = obj;
}
public Object getproxy(){
//创建代理类,会在代理类代理的方法里加super.invoke
return Proxy.newProxyInstance(this.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("aaa");
Object invoke = method.invoke(obj, args);
System.out.println("bbb");
return invoke;
}
}
package com.example.webdemo01.demo;
import com.example.webdemo01.Service.UserServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DemoApplicationTests {
@Test
public void method(){
Host host = new Host();
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
proxyInvocationHandler.setObj(host);
Rent getproxy = (Rent)proxyInvocationHandler.getproxy();
getproxy.rent();
}
}
CGLIB动态代理
用JDK动态代理必须有一个接口类,使用CGLIB动态代理不需要接口类。