代理模式
简而言之,就是原本需要进行额外处理的业务功能,交由代理对象进行处理
自己只需专注于完成自己主要功能即可。
代理分为静态代理和动态代理。
静态代理:代理对象类需要实现当前被代理对象的父类接口,且每个方法都要单独进行实现,也就是实现重写被代理对象的父接口的方法。
动态代理:jdk动态代理(只能对接口实现动态代理)
cglib动态代理(可以对实体类实现动态代理)
1.静态代理
//接口
package com.lipengg.service;
/**
* @author lipengg
* @date 2021/9/17
*/
public interface UserService {
String getName();
String getPass();
String getAdvice();
}
package com.lipengg.handler;
/**
* @author lipengg
* @date 2021/9/17
*/
//静态代理类
import com.lipengg.service.UserService;
public class StaticUserService implements UserService {
private UserService userService;
public StaticUserService(UserService userService) {
this.userService = userService;
}
@Override
public String getName() {
System.out.println("进入代理方法");
String name = userService.getName();
System.out.println("代理完成");
return name;
}
@Override
public String getPass() {
System.out.println("进入代理方法");
String name = userService.getPass();
System.out.println("代理完成");
return name;
}
@Override
public String getAdvice() {
return null;
}
}
//测试类
public class Test01 {
@Test
public void testStatic(){
UserService userService = new UserServiceImpl();
StaticUserService staticUserService = new StaticUserService(userService);
String name = staticUserService.getName();
//String pass = staticUserService.getPass();
System.out.println(name);
//System.out.println(pass);
}
}
2.jdk动态代理
通过实现InvocationHandler接口来完成
值得注意的是,jdk的动态代理只能为接口产生代理
package com.lipengg.handler;
/**
* @author lipengg
* @date 2021/9/17
*/
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkUserService implements InvocationHandler {
//代理的目标对象
private Object target;
//绑定当前对象,也就是知道被代理对象的情况下,生产代理对象
public Object bindObject(Object target){
this.target = target;
/**
* public static Object newProxyInstance(ClassLoader loader,
* Class<?>[] interfaces,
* InvocationHandler h)
* arg1:当前类(代理类)的字节码文件
* arg2:接口(被代理接口)的字节码文件
* arg3:代理回调,回调时执行的对象
*/
return Proxy.newProxyInstance(JdkUserService.class.getClassLoader(), target.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//回调时执行
System.out.println("执行前");
Object invoke = method.invoke(target, args);
System.out.println("执行后");
return invoke;
}
}
//测试类
public class Test01 {
@Test
public void testJDK(){
UserService userService = new UserServiceImpl();
JdkUserService jdkUserService = new JdkUserService();
UserService o = (UserService) jdkUserService.bindObject(userService);
String name = o.getName();
System.out.println(name);
}
}
3.cglib动态代理
cglib动态代理:可以实现具体类的代理
/*
导入cglib的依赖
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
*/
package com.lipengg.handler;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InvocationHandler;
import java.lang.reflect.Method;
/**
* @author lipengg
* @date 2021/9/17
*/
/**
* cglib动态代理:可以实现具体类的代理
*/
public class CglibUserService implements InvocationHandler {
private Object target;
public Object bindObject(Object target){
this.target = target;
//1.创建增强类
Enhancer enhancer = new Enhancer();
//2.给增强类赋值,.class
enhancer.setSuperclass(target.getClass());
//3.设置回调方法
enhancer.setCallback(this);
//4.创建增强类对象
Object o = enhancer.create();
return o;
}
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("cglib执行前");
Object invoke = method.invoke(target,objects);
System.out.println("cglib执行后");
return invoke;
}
}
public class Test01 {
@Test
public void testCglib(){
UserServiceImpl userService = new UserServiceImpl();
CglibUserService cglibUserService = new CglibUserService();
UserServiceImpl o = (UserServiceImpl) cglibUserService.bindObject(userService);
String name = o.getName();
System.out.println(name);
}
}