CGLIB代理
说明
- jdk代理:要求必须有/实现接口,如果没有接口,则jdk不能执行
- cglib代理:要求被代理者有无接口都可以,代理对象是目标的子类,重写代理方法
代码
package com.jt.proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
public class CGlibProxy {
public static Object getProxy(Object target){
//创建增强器对象
Enhancer enhancer = new Enhancer();
//设定父级 目标对象
enhancer.setSuperclass(target.getClass());
//定义回调方法:代理对象执行方法时调用
enhancer.setCallback(getMethodInterceptor(target));
//创建代理对象
return enhancer.create();
}
public static MethodInterceptor getMethodInterceptor(Object target){
return new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("事务开始");
Object result = method.invoke(target,objects);
System.out.println("事务提交");
return result;
}
} ;
}
}
package com.jt;
import com.jt.config.SpringConfig;
import com.jt.proxy.CGlibProxy;
import com.jt.proxy.JDKProxy;
import com.jt.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class TestSpring {
@Test
public void TestDemo1(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean(UserService.class);
//获取代理对象
UserService proxy = (UserService)JDKProxy.getProxy(userService);
//代理对象执行方法
proxy.addUser();
}
@Test
public void TestDemo2(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean(UserService.class);
//获取代理对象
UserService proxy = (UserService)JDKProxy.getTimeProxy(userService);
//代理对象执行方法
proxy.addUser();
}
@Test
public void TestDemo3(){
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean(UserService.class);
UserService proxy = (UserService) CGlibProxy.getProxy(userService);
proxy.addUser();
}
}
Gitee:
https://gitee.com/the_king_153/spring-demo.git