Spring AOP 的手动 cjlib 动态代理
使用 cjlib 需要导入的包
-
使用 cglib需要两个jar包:asm.jar和cglib.jar
-
也可以直接导入 spring-core 包,该包中有上面两个包
代码过程
编写目标类(切入点)
创建目标类 UserServiceImpl :
public class UserServiceImpl {
public void addUser() {
System.out.println("adduser");
}
public void updateUser() {
System.out.println("updateuser");
}
public void deleteUser() {
System.out.println("deleteuser");
}
}
编写切面类(通知)
创建切面类 MyAspect:
public class MyAspect {
//前方法
public void before(){
System.out.println("前方法");
}
//后方法
public void after(){
System.out.println("后方法");
}
}
编写工厂类
创建工厂类 MyBeanFactory:
public class MyBeanFactory {
public static UserServiceImpl createUserService(){
//目标类
final UserServiceImpl service = new UserServiceImpl();
//切面类
final MyAspect myAspect = new MyAspect();
//CGLIB 字节码增强
/*
没有接口,只有实现类
采用字节码增强框架 cglib,在运行时创建目标子类,从而对目标进行增强
导入jar包
*/
//代理类
//核心类。
//Enhancer 增强因子
Enhancer enhancer = new Enhancer();
//确定父类
enhancer.setSuperclass(service.getClass());
/*
设置回调函数,MethodInterceptor 这个接口就等效于InvacationHandler
参数一、二、三和invoke一样
*/
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//前方法
myAspect.before();
//执行目标方法
Object obj = method.invoke(service, args);
//和下面一样的
//它将会去执行代理类的父类,执行目标(目标类和代理类 父子关系)
//Object obj = methodProxy.invokeSuper(proxy, args);
//后方法
myAspect.after();
return obj;
}
});
//创建代理
UserServiceImpl proxyService = (UserServiceImpl) enhancer.create();
return proxyService;
}
}
测试代码
UserServiceImpl userService = (UserServiceImpl) MyBeanFactory.createUserService();
userService.addUser();
userService.updateUser();
userService.deleteUser();
有错误请指出!谢谢!