1.定义
代理对象控制着对于原对象的访问,并允许在原对象的访问前后进行自定义处理。
2.实现方式
抽象接口
// 抽象接口
public interface ISubject {
void save();
}
//抽象接口真实实现
public class SubjectImpl implements ISubject{
@Override
public void save() {
System.out.println("处理业务逻辑");
}
}
2.1 静态代理
public class SubjectProxy implements ISubject{
private final SubjectImpl subjectImpl;
public SubjectProxy(SubjectImpl subjectImpl) {
this.subjectImpl = subjectImpl;
}
@Override
public void save() {
System.out.println("代理前置处理");
subjectImpl.save();
System.out.println("代理后置处理");
}
// 测试方法
public static void main(String[] args) {
SubjectImpl subject = new SubjectImpl();
SubjectProxy subjectProxy = new SubjectProxy(subject);
subjectProxy.save();
}
}
2.2 jdk动态代理
public class JdkProxyFactory {
private final Object target;
public JdkProxyFactory(Object target) {
this.target = target;
}
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前置处理");
Object object = method.invoke(target,args);
System.out.println("代理后置处理");
return object;
}
}
);
}
public static void main(String[] args) {
ISubject subject = new SubjectImpl();
ISubject proxy = (ISubject) new JdkProxyFactory(subject).getProxyInstance();
proxy.save();
}
}
2.3 cglib动态代理
由于jdk动态代理的目标类限制必须实现一个或多个接口,所以cglib算是对jdk动态代理的补充,cglib动态代理不需要目标类实现接口。
// 1.实现MethodInterceptor接口
public class CglibProxyFactory implements MethodInterceptor {
// 2.生成cglib动态代理类方法
public Object getTargetProxy(Object target) {
// Enhancer增强器,创建代理类
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
/**
* callback回调方法
*
* @param obj "this", the enhanced object
* @param method intercepted Method
* @param args argument array; primitive types are wrapped
* @param proxy used to invoke super (non-intercepted method); may be called
* as many times as needed
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("代理前置处理");
Object object = proxy.invokeSuper(obj, args);
System.out.println("代理后置处理");
return object;
}
public static void main(String[] args) {
SubjectImpl target = new SubjectImpl();
SubjectImpl targetProxy = (SubjectImpl) new CglibProxyFactory().getTargetProxy(target);
targetProxy.save();
}
}
3.总结
主要用于对目标对象的功能的额外操作,比如日志记录,防火墙保护,白名单等功能。