前言
spring动态代理技术主要为JDK和CGLIB。
JDK:必须借助一个接口才能产生代理对象
CGLIB:对于没有提供接口的类,只能采用此代理方式
CGLIB(Code Generation Library) 是一个高性能开源的代码生成包,采用最底层的字节码技术,对指定的类生成一个子类,并对子类进行增强。spring Code包已经集成了CGLIB所需要的的jar包,不需要另外导入jar包。/font>
一、创建UserDao?
package org.example.cglib;
public class UserDao {
public void save(){
System.out.println("保存");
}
public void modify(){
System.out.println("修改");
}
public void delete(){
System.out.println("删除");
}
}
二、创建代理类
package org.example.cglib;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 创建CGLIB代理对象
* 重写inttercept方法
*/
public class Cglib implements MethodInterceptor {
/**
*创建代理方法,生成CGLIB代理对象
* target是目标对象,需要增强的对象
* 返回目标对象的代理对象
*/
public Object createProxy(Object target){
//创建一个动态类对象,即增强类对象
Enhancer enhancer = new Enhancer();
//确定需要增强的类,设置为父类
enhancer.setSuperclass(target.getClass());
//确定代理逻辑对象为当前对象,要求当前对象实现MethodInterceptor方法
enhancer.setCallback(this);
//返回创建的代理对象
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
aspect as = new aspect();
as.check();
Object o1 = methodProxy.invokeSuper(o,objects);
as.expect();
return o1;
}
}
三、创建切面类
package org.example.cglib;
public class aspect {
public void check(){
System.out.println("模拟权限控制");
}
public void expect(){
System.out.println("模拟异常处理");
}
}
三、创建测试类
package org.example.cglib;
import com.sun.javaws.Main;
import org.example.UserDaoimpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
public static void main( String[] args ) {
//创建代理对象
Cglib cglib = new Cglib();
//创建目标对象
UserDao userDao = new UserDao();
//获取增强以后的目标对象
UserDao DaoAdvice = (UserDao) cglib.createProxy(userDao);
//测试
DaoAdvice.save();
System.out.println("-------------");
DaoAdvice.delete();
System.out.println("-------------");
DaoAdvice.delete();
System.out.println("-------------");
}
}