1. 分类
2. 简介
- 代理模式(Proxy pattern):
- 核心作用:
- 通过代理控制对对象的访问,可以详细控制访问某个(某类)对象的方法,在调用这个方法前作前置处理,调用这个方法后作后置处理。(即:AOP的微观实现)
- AOP(Aspect Oriented Programming面向切面编程)的核心实现机制
- 核心角色:
- 抽象角色
- 定义代理角色和真实角色的公共对外方法
- 真实角色
- 实现抽象角色,定义真是角色所要实现的业务逻辑,供代理角色调用
- 关注真正的业务逻辑
- 代理角色
- 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作
- 将统一的流程控制放到代理角色中处理
- 应用场景
- 安全代理:屏蔽对真实角色的直接访问
- 远程代理:通过代理类处理远程方法调用
- 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象
- 分类:
- 静态代理(静态定义代理类)
- 动态代理(动态生成代理类)
- JDK自带的动态代理
- Javaassist字节码操作库实现
- CGLIB
- ASM(底层使用指令,可维护性较差)
- 抽象角色
- 核心作用:
3. 静态代理
创建角色模板
/**
* 角色
*/
public interface Role {
// 唱歌之前准备
void before();
// 本人唱歌
void sing();
// 唱歌之后收尾
void after();
}
创建真实对象
/**
* 真实角色
*/
public class RealRole implements Role {
@Override
public void before() {
System.out.println("RealRole.before()");
}
@Override
public void sing() {
System.out.println("真实角色唱歌");
}
@Override
public void after() {
System.out.println("RealRole.after()");
}
}
创建代理对象
/**
* 代理角色
*/
public class ProxyRole implements Role {
private Role role;
public ProxyRole(Role role) {
super();
this.role = role;
}
@Override
public void before() {
System.out.println("代理角色在真实角色唱歌之前做好准备工作");
}
@Override
public void sing() {
role.sing();
}
@Override
public void after() {
System.out.println("代理角色为真实角色做收尾工作");
}
}
测试
public class Client {
public static void main(String[] args) {
Role realRole = new RealRole();
Role proxyRole = new ProxyRole(realRole);
proxyRole.before();
proxyRole.sing();
proxyRole.after();
}
}
控制台打印
代理角色在真实角色唱歌之前做好准备工作
真实角色唱歌
代理角色为真实角色做收尾工作
4. 动态代理
- JDK自带的动态代理
java.lang.reflect.Proxy
- 作用:动态生成代理类和对象
java.lang.reflect.InvocationHandler
(处理器接口)- 可以通过invoke方法实现对真实角色的代理访问
- 每次通过Proxy生成代理类对象时都要指定对应的处理器对象
沿用上文的Role
接口和RealRole
类
创建代理类
public class RoleHandler implements InvocationHandler {
Role realRole;
public RoleHandler(Role realRole) {
super();
this.realRole = realRole;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object object = null;
System.out.println("在真实角色唱歌之前做好准备工作");// 实际执行之前的操作
if (method.getName().equals("sing")) {
method.invoke(realRole, args);
}
System.out.println("为真实角色做收尾工作");// 实际执行之后的操作
return object;
}
}
测试
public class Client {
public static void main(String[] args) {
Role realRole = new RealRole();
RoleHandler handler = new RoleHandler(realRole);
Role proxy = (Role) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[] { Role.class },
handler);
proxy.sing();
}
}
控制台打印
在真实角色唱歌之前做好准备工作
真实角色唱歌
为真实角色做收尾工作
5. AOP
它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术,它是一种新的方法论,他是对传统OOP编程的一种补充