一、代理的分类
按照代理对象创建时期的不同,代理类可以分为两种:
1、静态代理:由程序员手动创建代理类或者使用特定工具自动生成源代码,然后对源代码进行编译,在程序运行之前代理类的.class文件就已经存在了.
2、动态代理:在程序运行期间使用反射技术动态的创建.
二、静态代理实现
1、首先定义一个接口 UserService
public interface UserService {
public abstract void register();
public abstract void login();
}
2、目标类(被代理类)实现UserService接口
public class UserServiceImpl implements UserService {
@Override
public void register() {
System.out.println("用户正在使用注册功能.....");
}
@Override
public void login() {
System.out.println("用户正在使用登录功能.....");
}
}
3、定义一个静态代理类(StaticProxy)也实现UserService接口,通过组合和有参数构造方法引入UserServiceImpl实例,并添加增强的功能
public class StaticProxy implements UserService {
// 使用组合的方式引入UserService的实例
private UserService userService;
// 通过构造方法引入UserServiceImpl
public StaticProxy(UserService userService){
this.userService = userService;
}
@Override
public void register() {
System.out.println("开始增加日志功能");
userService.register();
System.out.println("日志功能添加完毕");
}
@Override
public void login() {
System.out.println("开始增加异常处理功能");
userService.login();
System.out.println("异常处理功能添加完毕");
}
}
4、测试类
public class TestProxy {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
StaticProxy staticProxy = new StaticProxy(userService);
staticProxy.register();
System.out.println("***************************");
staticProxy.login();
}
}
5、测试结果
开始增加日志功能
用户正在使用注册功能.....
日志功能添加完毕
***************************
开始增加异常处理功能
用户正在使用登录功能.....
异常处理功能添加完毕
三、动态代理实现
1、首先定义一个接口 UserService
public interface UserService {
public abstract String register();
public abstract void login();
}
2、目标类(被代理类)实现UserService接口
public class UserServiceImpl implements UserService {
@Override
public String register() {
System.out.println("用户正在使用注册功能.....");
return "xiaomaomao!!!";
}
@Override
public void login() {
System.out.println("用户正在使用登录功能.....");
}
}
3、创建一个动态代理类实现IncocationHandler接口
public class DynamicProxy implements InvocationHandler {
// 通过组合的方式传入目标对象
private Object obj;
public DynamicProxy(Object obj) {
this.obj = obj;
}
// proxy:目标对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object returnValue = null;
// 根据不同的方法名来筛选,对不同的方法进行不同的增强
String name = method.getName();
if ("register".equals(name)) {
System.out.println("开始增加日志功能");
returnValue = (String) method.invoke(obj, args);
System.out.println("日志功能添加完毕");
} else if ("login".equals(name)) {
System.out.println("开始增加异常处理功能");
returnValue = method.invoke(obj, args);
System.out.println("异常处理功能添加完毕");
}
return returnValue;
}
}
4、测试类
public class TestProxy {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
// 返回的代理对象实际上就是UserService的实现类对象
UserService proxy = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(), new DynamicProxy(userService));
String value = proxy.register();
System.out.println("****************************");
proxy.login();
System.out.println(value);
}
}
5、测试结果
开始增加日志功能
用户正在使用注册功能.....
日志功能添加完毕
****************************
开始增加异常处理功能
用户正在使用登录功能.....
异常处理功能添加完毕
xiaomaomao!!!