暑期ssh框架spring学习笔记三

要实现面向切向编程,就要实现代理类。上一篇博客实现的是代理中的手动代理中的jdk动态代理,除此之外还有一种手动代理的方式是实现cglib代理。与jdk代理的主要区别在于在dao层中,他不用实现接口,而可以直接实现目标类:在cn.itcast.dao包下,直接实现目标类:
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();
       }
}

运行结果如下所示:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值