一.与JDK动态代理的区别:
jdk动态代理:基于接口,实现接口中相同的方法去实现的;
cglib动态代理:父子继承关系.原始类作为父类,代理类作为子类,这样也跟jdk一样保证了2者方法一致.同时在代理类中提供新的方法.
二.demo:
2.1 原始类:UserService
package com.baizhiedu.cglib;
/**
* cglib动态代理的原始类
*/
public class UserService {
public void login(){
System.out.println("登录功能...");
}
public void register(){
System.out.println("注册功能...");
}
}
2.2 代理功能实现:
package com.baizhiedu.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.awt.*;
import java.lang.reflect.Method;
/**
* cglib动态代理
*/
public class TestCglibProxy {
public static void main(String[] args) {
//1.创建原始类
final UserService userService = new UserService();
//2.创建代理类+额外功能
Enhancer enhancer = new Enhancer();
//借一个classLoader
enhancer.setClassLoader(TestCglibProxy.class.getClassLoader());
//3.创建静态累不累,提供额外功能+运行原始对象的方法----等同于InvocationHandler和里面的invoke方法
MethodInterceptor methodInterceptor=new MethodInterceptor() {
/**
*
* @param o 原始对象
* @param method 原始方法
* @param args 原始方法的参数
* @param methodProxy 代理对象
* @return
* @throws Throwable
*/
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib额外功能...");
//invoke参数1:表示method是属于哪个方法的? 很明显是属于userService的
return method.invoke(userService, args);
}
};
enhancer.setCallback(methodInterceptor);
enhancer.setSuperclass(userService.getClass());
UserService userServiceProxy = (UserService ) enhancer.create();
userServiceProxy.login();
userServiceProxy.register();
}
}
注意: cglib中的MethodInterceptor和spring中的MethodInterceptor不一样,这里是属于cglib包下的MethodInterceptor