1. 程式人生 > >JavaEE AOP動態代理——CGLIB代理

JavaEE AOP動態代理——CGLIB代理

JDK動態代理的使用非常簡單,但他還有一定的侷限性——使用動態代理的物件必須是實現了介面的類,如果要對沒有實現介面的類進行代理那麼就可以使用CGLIB代理

接下來通過一個案例來演示CGLIB代理的實現過程

1、在src目錄下建立一個com.itheima.cglib包,在包中建立一個類UserDao,不需要實現任何介面,只需要定義一個新增使用者和一個刪除使用者方法,程式碼如下所示:

package com.itheima.cglib;

public class UserDao {
	public void addUser() {
		System.out.println("新增使用者");
	}
	public void deleteUser() {
		System.out.println("刪除使用者");
	}

}

2、在com.itheima.cglib包中建立代理類CglibProxy,該代理類需要實現MethodInterceptor介面,並實現介面中的intercept()方法,程式碼如下(在下面的程式碼中需要匯入MyAspect這個類,此類和上一篇文章中的一樣,不清楚的點選這

package com.itheima.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 com.itheima.aspect.MyAspect;
//代理類
public class CglibProxy implements MethodInterceptor {

	//代理方法
	public Object createProxy(Object target) {
		//建立一個動態類物件
		Enhancer  enhancer = new Enhancer();
		//確定需要增強的類,設定其父類
		enhancer.setSuperclass(target.getClass());
		//設定回撥函式
		enhancer.setCallback(this);
		//返回建立的代理類
		return enhancer.create();
	}
	@Override
	public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
		
		//建立切面類物件
		MyAspect myAspect = new MyAspect();
		//前增強
		Object obj = methodProxy.invokeSuper(proxy, args);
		//後增強
		myAspect.log();
		
		return obj;
	}

}

3、在com.itheima.cglib包中,建立測試類CglibTest。在該類的main()方法中首先建立代理物件和目標物件,然後從代理物件獲得增強後的目標物件,最後呼叫物件的新增和刪除方法,程式碼如下所示:

package com.itheima.cglib;

public class CglibTest {

	public static void main(String[] args) {
		//建立代理物件
		CglibProxy cglibProxy = new CglibProxy();
		//建立目標物件
		UserDao userDao = new UserDao();
		//獲取增強後的目標物件
		UserDao userDao2 = (UserDao) cglibProxy.createProxy(userDao);
		//執行方法
		userDao2.addUser();
		userDao2.deleteUser();

	}

}

4、執行程式後,輸出結果如下:

從輸出結果來看,UserDao中的方法確實被增強了