Spring使用JDK与CGLIB两种动态代理
JDK动态代理:
有接口的类使用JDK的动态代理(JDK动态代理不支持没有接口的类
)
如果有n个接口,必然有n个实现,只用写1个代理类JDKProxy就可以对所有有接口进行处理
如果有代理主题角色存在,必须修改调用方才能实现代理
CGLIB动态代理:
没有接口的类使用CGLIB动态代理(类有没有接口都可以支持)
只用写1个代理类CglibProxy就可以对所有没有接口的不能是final类都进行处理
如果有代理主题角色存在,必须修改调用方才能实现代理
静态代理
抽象主体
//抽象主体
public interface IUserService {
//买虾方法
public void rend();
}
真实主体
//真实的主体
public class UserServiceImpl implements IUserService{
public void rend() {
System.out.println("皮皮虾真正卖大龙虾...........");
}
}
代理主体角色
//代理主体角色
public class UserServiceImplProxy implements IUserService{
private IUserService userService;
public UserServiceImplProxy(IUserService userService){
this.userService = userService;
}
public void rend() {
try {
System.out.println("签买卖合同");
userService.rend();
System.out.println("打款");
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("发放大龙虾");
}
}
}
测试
@Test
public void testStaticProxy()throws Exception{
//真实主体
UserServiceImpl userService = new UserServiceImpl();
//代理主体
UserServiceImplProxy userServiceImplProxy = new UserServiceImplProxy(userService);
userServiceImplProxy.rend();
}
动态代理
抽象主体
//抽象主体
public interface IUserService {
//买虾方法
void rend();
//查询方法
void find();
}
真实主体
//真实主体角色
public class UserServiceImple implements IUserService{
public void rend() {
System.out.println("皮皮虾卖大龙虾..............");
}
public void find() {
System.out.println("查询皮皮虾有几斤大龙虾...............");
}
}
事物管理器TxManager
public class TxManager {
public void begin(){
System.out.println("开启事物...");
}
public void commit(){
System.out.println("提交事物...");
}
public void close(){
System.out.println("关闭事物...");
}
public void rollback(Throwable e){
System.out.println("回滚事物..." + e);
}
}
JDK动态代理
public class JdkProxy implements InvocationHandler {
//真实主体角色
private Object target;
//事物管理者
private TxManager txManager;
public JdkProxy(Object target, TxManager txManager) {
this.target = target;
this.txManager = txManager;
}
/**
* @param proxy 代理对象
* @param method 代理方法
* @param args 参数
* @return
* @throws Throwable
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
if(method.getName().startsWith("find")){
method.invoke(target);
}else {
txManager.begin();
method.invoke(target);
txManager.commit();
}
} catch (Throwable e) {
e.printStackTrace();
txManager.rollback(e);
} finally {
if(method.getName().startsWith("find")){
}else {
txManager.close();
}
}
return null;
}
//提供方法来得到代理对象
public Object createProxy(){
//第一个参数:目标类的类加载器
//第二个参数:Class实例
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
}
CGLIB动态代理
public class CglibProxy implements MethodInterceptor {
//真实主体角色
private Object target;
//事物管理者
private TxManager txManager;
public CglibProxy(Object target, TxManager txManager) {
this.target = target;
this.txManager = txManager;
}
/**
*
* @param o
* @param method
* @param objects
* @param methodProxy
* @return
* @throws Throwable
*/
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
try {
if(method.getName().startsWith("find")){
method.invoke(target);
}else {
txManager.begin();
method.invoke(target);
txManager.commit();
}
} catch (Throwable e) {
e.printStackTrace();
txManager.rollback(e);
} finally {
if(method.getName().startsWith("find")){
}else {
txManager.close();
}
}
return null;
}
//创建代理的时候 不一样
public Object createProxy(){
//通过这个增强类
Enhancer enhancer = new Enhancer();
//设置代理类
enhancer.setSuperclass(target.getClass());
//回调到intercept方法
enhancer.setCallback(this);
return enhancer.create();
}
}
测试
@Test
public void testJdkProxy() throws Exception {
//真实主体角色
IUserService userService = new UserServiceImple();
TxManager txManager = new TxManager();
//代理类对象
CglibProxy cglibProxy = new CglibProxy(userService, txManager);
//得到代理对象
IUserService proxy = (IUserService)cglibProxy.createProxy();
proxy.rend();
}