spring中的Cglib字节码增强实现AOP

来源:互联网 发布:植村秀淘宝旗舰店 编辑:程序博客网 时间:2024/06/18 16:24

我们在使用jdk提供的动态代理时,目标类要求必须是一个接口,而有些情况下目标类没有任何父类,这时就可以使用cglib字节码增强的方式实现

cglib可以在没有接口只有实现类的情况下进行AOP

步骤一:导包

spring-core-3.2.0.jar包中包含asm.jar和cglib.jar这两个jar包是核心包

步骤二:编写目标类

package com.wency.service;public class BookServiceImpl {public void addBook(){System.out.println("添加书籍");}public void deleteBook(){System.out.println("删除书籍");}}

步骤三:编写切面类

package com.wency.aspect;/** * 切面类 * @author zhangwen * */public class MyAspect {public void before(){System.out.println("执行前方法");}public void after(){System.out.println("执行后方法");}}

步骤四:编写工厂类

package com.wency.factory;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;import com.wency.aspect.MyAspect;import com.wency.service.BookServiceImpl;public class CglibFactory {public BookServiceImpl createBookService(){//1.创建切面类final MyAspect myAspect=new MyAspect();//2.创建目标类final BookServiceImpl bookService=new BookServiceImpl();//3.创建增强类Enhancer enhancer=new Enhancer();//4.设置增强类的父类enhancer.setSuperclass(BookServiceImpl.class);//5.设置回调函数enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy arg3) throws Throwable {// TODO Auto-generated method stub//执行前方法myAspect.before();//执行目标类的方法Object object = method.invoke(bookService, args);//执行后方法myAspect.after();return object;}});//6.创建代理类BookServiceImpl bookServiceImpl=(BookServiceImpl) enhancer.create();return bookServiceImpl;}}

步骤五:编写测试类

package com.wency.test;import org.junit.Test;import com.wency.factory.CglibFactory;import com.wency.service.BookServiceImpl;public class TestBookService {@Testpublic void testCglibProxy(){CglibFactory cglibFactory=new CglibFactory();BookServiceImpl bookService = cglibFactory.createBookService();bookService.addBook();bookService.deleteBook();}}


后台的输出信息:


执行前方法
添加书籍
执行后方法
执行前方法
删除书籍
执行后方法

原创粉丝点击