要实现面向切向编程,就要实现代理类。上一篇博客实现的是代理中的手动代理中的jdk动态代理,除此之外还有一种手动代理的方式是实现cglib代理。与jdk代理的主要区别在于在dao层中,他不用实现接口,而可以直接实现目标类:在cn.itcast.dao包下,直接实现目标类:
下面是我们的切面类,和jdk动态代理的切面类的代码是一样的,其中封装多个advice
下面的代码用切面类中的advice增强目标类中的方法,和用jdk动态代理实现增强的方式会略有不同,会在下面着重指出
代码增强完成,下面将“烹饪”好的面包取出(和jdk动态代理的代码是一样的)
package cn.itcast.dao;
//target目标类
public class BookDao{
public void save(){
System.out.println("save添加图书");
}
public void update(){
System.out.println("update修改图书");
}
public void delete(){
System.out.println("delete删除图书");
}
public void find(){
System.out.println("find查询图书");
}
}
下面是我们的切面类,和jdk动态代理的切面类的代码是一样的,其中封装多个advice
package cn.itcast.jdk;
//切面类,其中封装多个advice
public class MyAspect{
public void myBefore(){
System.out.println("方法执行前");
}
public void myAfter(){
System.out.println("方法执行后");
}
}
下面的代码用切面类中的advice增强目标类中的方法,和用jdk动态代理实现增强的方式会略有不同,会在下面着重指出
package cn.itcast.cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import cn.itcast.dao.BookDao;
import cn.itcast.jdk.MyAspect;
//代理类
public class MyBeanFactory{
public static BookDao getBean(){
//1:与jdk动态代理方式完全一致,创建目标类(准备面包)
final BookDao bookDao=new BookDao();
//2:与jdk动态代理方式完全一致,创建切面类实例(准备食材)
final MyAspect myAspect=new MyAspect();
//3:进行增强的方式有所不同(烹饪的方式有所不同),这里在生成代理类时,会生成代理对象的子类
//3.1:生成代理类中的核心类
Enhancer enhancer=new Enhancer();
//3.2:确定需要增强的类
enhancer.setSuperclass(bookDao.getClass());
//3.3::添加回调函数
enhancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object proxy,Method method,Object[] args,MethodProxy) throws Throwable{
//#1、之前
myAspect.myBefore();
//#2、目标方法执行
Object obj=method.invoke(bookDao,args);
//#3、之后
myAspect.myAfter();
return obj;
}
});
//3,4:创建代理类
BookDao bookDaoProxy=(BookDao)enhancer.create();
return bookDaoProxy;
}
}
代码增强完成,下面将“烹饪”好的面包取出(和jdk动态代理的代码是一样的)
package cn.itcast.cglib;
import org.junit.Test;
import cn.itcast.dao.BookDao;
poublic class TestCGLIB{
@Test
public void demo01(){
BookDao bookDao=MyBeanFactory.getBean();
//2.执行方法
bookDao.save();
bookDao.update();
bookDao.delete();
bookDao.find();
}
}
运行结果如下所示: