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

我们在使用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();
	}
}


后台的输出信息:


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

发布了38 篇原创文章 · 获赞 6 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/coderlady/article/details/73744001