jdk动态代理:
- 基于接口实现,因此若目标类没有实现接口,则这种方式失效,需使用cglib动态代理实现。
jdk动态代理使用步骤:
- 创建目标接口
- 创建目标类,实现目标接口
- 创建代理类,实现InvocationHandler接口
- 在具体使用处通过Proxy类获取代理对象,利用代理对象实现目标类的功能
aop:aop是面向切面编程,主要是指对功能增强不需要修改源代码。
下面以aop来介绍上述过程:
1.创建目标接口
interface Service {
void add();
void update();
}
2.创建目标类,实现目标接口
class ServiceTarget implements Service{
public void add() {
System.out.println("target add .................");
}
public void update() {
System.out.println("target update ..................");
}
}
3.创建代理类,实现InvocationHandler接口
public class ProxyService implements InvocationHandler{
private Object target;
public ProxyService(Object target) {
super();
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before...............");
Object ret = method.invoke(target, args);
System.out.println("after................");
return ret;
}
}
4.在具体使用处通过Proxy类获取代理对象,利用代理对象实现目标类的功能
public class Test {
public static void main(String[] args) {
Service service = new ServiceTarget();
ProxyService proxy = new ProxyService(service);
Service proxyService =
(Service) Proxy.newProxyInstance
(service.getClass().getClassLoader(),
service.getClass().getInterfaces(), proxy);
proxyService.add();
System.out.println();
proxyService.update();
}
}
执行结果
cglib动态代理:
- apache的一个开源项目
- 基于继承实现,使用时需导入cglib.jar和asm.jar
cglib动态代理具体使用步骤(以aop为例):
- 创建目标类
- 创建代理类,实现MethodInterceptor接口
- 创建一个工厂,用于创建增强后的对象
- 在具体使用处通过工厂创建代理对象,实现目标类的功能
下面给出具体代码:
1.创建目标类
class Base {
public void add() {
System.out.println("add...............");
}
}
2.创建代理类,实现MethodInterceptor接口
class CglibProxy implements MethodInterceptor {
public Object intercept(Object arg0, Method arg1, Object[] arg2,
MethodProxy arg3) throws Throwable {
System.out.println("before............");
arg3.invokeSuper(arg0, arg2);
System.out.println("after..............");
return null;
}
}
3.创建一个工厂,用于创建增强后的对象
class BaseFactory {
public static Base getInstance(CglibProxy proxy) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Base.class);
enhancer.setCallback(proxy);
Base base = (Base) enhancer.create();
return base;
}
}
4.在具体使用处通过工厂创建代理对象,实现目标类的功能
public class Test {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
Base base = BaseFactory.getInstance(proxy);
base.add();
}
}
执行结果: