没有接口,只有实现类。
采用字节码增强框架cglib, 在运行时,创建目标类的子类,从而对目标类进行增强。
实现类,没有实现任何接口
public class UserServiceImpl {
public void addUser() {
System.out.println("cglib adduser...");
}
public void updateUser() {
System.out.println("cglib updateUser...");
}
}
切面
public class MyAspect {
public void before(){
System.out.println("cglib 事务开启");
}
public void after(){
System.out.println("cglib 事务结束");
}
}
工厂,产生代理类
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class BeanFactory {
public static UserServiceImpl createProxyService(){
final UserServiceImpl userService = new UserServiceImpl();
final MyAspect myAspect = new MyAspect();
// 核心类
Enhancer enhancer = new Enhancer();
// 确定父类
enhancer.setSuperclass(UserServiceImpl.class);
// 设置回调函数
enhancer.setCallback(new MethodInterceptor() {
// 等效于jdk中的invoke方法
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
myAspect.before();
// 执行目标类的方法
Object obj = method.invoke(userService, args);
myAspect.after();
return obj;
}
});
// 创建代理
UserServiceImpl proxyService = (UserServiceImpl)enhancer.create();
return proxyService;
}
}
测试类:
import org.junit.Test;
public class TestProxy {
@Test
public void test(){
UserServiceImpl us = BeanFactory.createProxyService();
us.addUser();
us.updateUser();
}
}