对于没有实现接口的类,就不能使用jdk动态代理
目标类
package com.pactera.daoImpl;
public class UserDao{
public void save() {
System.out.println("userDao save()");
}
}
代理工厂
package com.pactera.proxy;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
//cglib动态代理工厂,需要引入cglib jar包,或spring核心包(4.1中已经集成)
public class ProxyFactory implements MethodInterceptor{
//接收传入的目标对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
//创建代理对象并返回
public Object createProxyInstance(){
//代理对象的字节码工具类
Enhancer en = new Enhancer();
//指定父类,生成的子类会自动集成该父类
en.setSuperclass(target.getClass());
//设置回调函数(执行目标对象的方法,会出发下面的interceptor()
en.setCallback(this);
return en.create();
}
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy arg3) throws Throwable {
//目标对象中植入事务代码
System.out.println("---开启事务----");
Object methodReturnValue = method.invoke(target, args);
System.out.println("-----关闭事务-----");
return methodReturnValue;
}
}
测试
@Test
public void testIOC(){
UserDao userDao = new UserDao();
UserDao proxy = (UserDao) new ProxyFactory(userDao).createProxyInstance();
proxy.save();
}