我们在使用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() {
@Override
public 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 {
@Test
public void testCglibProxy(){
CglibFactory cglibFactory=new CglibFactory();
BookServiceImpl bookService = cglibFactory.createBookService();
bookService.addBook();
bookService.deleteBook();
}
}
后台的输出信息:
执行前方法
添加书籍
执行后方法
执行前方法
删除书籍
执行后方法