Java通过cglib实现AOP

cglib:字节码增强。在运行时,生成目标类的子类,对目标类增强,实现AOP。

应用场景:一般在无接口,只有目标类时使用。

首先确保有如下两个包:

blob.png

如果项目中,已经使用了Spring,可以忽略导入上述两个包。因为在spring-core中已经集成了上述两个包

blob.png


假设已有如下目标类:

public class UserServiceImpl  {

	public void addUser() {
		System.out.println("add user");

	}
}

在此基础上,不修改源代码,在调用UserServiceImpl的实例方法前后,输出其他的信息。

首先,创建一个切面类MyAspect。

public class MyAspect  {

	 public void befor() {
		System.out.println("befor...");
	}
	 public void after() {
			System.out.println("after...");
		}
		
}

再创建一个工厂类,用来获取代理类的实例

import java.lang.reflect.Method;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

public class MyFactroy {

	public static UserServiceImpl GetUserService() {
		// 1 目标类
		final UserServiceImpl userService = new UserServiceImpl();
		// 2切面类
		final MyAspect myAspect = new MyAspect();
		// 3.代理类 ,采用cglib,底层创建目标类的子类
		// 3.1 核心类
		Enhancer enhancer = new Enhancer();
		// 3.2 确定父类
		enhancer.setSuperclass(userService.getClass());
		/*
		 * 3.3
		 * 使用匿名内部类,重写MethodInterceptor 
		 * methodProxy目标方法的代理(暂时不知道干啥用,略)
		 * 方法的代理
		 */
		enhancer.setCallback(new MethodInterceptor() {

			@Override
			public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
					throws Throwable {
				// 前
				myAspect.befor();

				// 执行目标类的方法
				Object obj = method.invoke(userService, args);
				// * 执行代理类的父类 ,执行目标类 (目标类和代理类 父子关系)
				//methodProxy.invokeSuper(proxy, args);

				// 后
				myAspect.after();
				return obj;
			}
		});
		// 3.4 创建代理
		UserServiceImpl proxService = (UserServiceImpl) enhancer.create();

		return proxService;
	}
}


用junit调用试试看。

import org.junit.Test;

public class MyTest {

	@Test
	public void test() {
		UserServiceImpl service = MyFactroy.GetUserService();
		service.addUser();
	}

}

输出结果:

befor...
add user
after...


posted @ 2017-02-18 10:11  划破黑夜  阅读(137)  评论(0编辑  收藏  举报