使用JDK动态代理要产生某个对象的代理对象,这个对象必须实现一个接口,动态代理技术只能基于接口进行代理。可是有时候我们在开发时碰到一些对象没有接口,故可以使用cglib动态代理,Enhancer类是CGLib中的一个字节码增强器,作用用于生成代理对象。
- UserServiceImpl类:此类没有父接口
package com.qfedu.aop02;
import java.util.List;
/**
* Created by HuangCong on 2020/2/26.
*/
public class UserServiceImpl<T> {
public List<T> getAllUser() {
System.out.println("------getAllUser------");
return null;
}
public boolean saveUser(T user) {
System.out.println("------saveUser------");
return false;
}
public boolean deleteUser(int uid) {
System.out.println("------deleteUser------");
return false;
}
public boolean updateUser(T obj) {
System.out.println("------updateUser------");
return false;
}
}
- MyAspect类:切面类
package com.qfedu.aop02;
/**
* Created by HuangCong on 2020/2/26.
*/
public class MyAspect {
public void before() {
System.out.println("==========before=========");
}
public void after() {
System.out.println("========after========");
}
}
- UserFactory类:用于实现生成代理对象
package com.qfedu.aop02;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* 使用Spring中的一个增强类来实现aop,Enhancer类是CGLib中的一个字节码增强器,作用用于生成代理对象
* 1. 创建Enhancer对象
* 2. 设置增强类Enhancer的superClass
* 3. 设置Enhancer对象的回调
* 4. 通过eh对象的create()方法来得到指定的对象
* Created by HuangCong on 2020/2/26.
*/
public class UserFactory {
public static UserServiceImpl getUserService() {
MyAspect ma = new MyAspect();
UserServiceImpl us = new UserServiceImpl<>();
// 1.创建Enhancer的对象
Enhancer eh = new Enhancer();
// 2.设置增强类
eh.setSuperclass(UserServiceImpl.class);
// 3.设置Enhancer的回调;
// MethodInterceptor接口:拦截器,即在调用目标方法时,CGLib会回调MethodInterceptor接口方法拦截
//
eh.setCallback(new MethodInterceptor() {
/*
Object:由CGLib动态生成的代理类实例,
Method:上文中实体类所调用的被代理的方法引用,
Object[]:参数值列表,
MethodProxy:生成的代理类对方法的代理引用。
返回:从代理实例的方法调用返回的值。
*/
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
ma.before();
Object obj = method.invoke(us, objects);
ma.after();
return obj;
}
});
// 4.执行eh.create()动态生成一个代理类,并从Object强制转型成父类型IUserService<Object>
UserServiceImpl ius = (UserServiceImpl) eh.create();
return ius;
}
}
- TestAOP02类:测试
package com.qfedu.aop02;
import org.junit.Test;
/**
* Created by HuangCong on 2020/2/26.
*/
public class TestAOP02 {
@Test
public void testUserService() {
/*
AOP_02
*/
UserServiceImpl ius = UserFactory.getUserService();
Object obj = new Object();
ius.getAllUser();
ius.saveUser(obj);
ius.deleteUser(1);
ius.updateUser(obj);
}
}