spring代理之动态代理
IUserDao.java
package cn.itcast.b_dynamic;
// 接口
public interface IUserDao {
void save();
}
UserDao.java
package cn.itcast.b_dynamic;
/**
* 目标对象
* @author Jie.Yuan
*
*/
public class UserDao implements IUserDao{
@Override
public void save() {
System.out.println("-----已经保存数据!!!------");
}
}
创建代理工厂
package cn.itcast.b_dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 给所有的dao创建代理对象【动态代理】
*
* 代理对象,不需要实现接口
* @author Jie.Yuan
*
*/
public class ProxyFactory {
// 维护一个目标对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
}
// 给目标对象,生成代理对象
public Object getProxyInstance() {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("开启事务");
// 执行目标对象方法
Object returnValue = method.invoke(target, args);
System.out.println("提交事务");
return returnValue;
}
});
}
}
App.java
package cn.itcast.b_dynamic;
public class App {
public static void main(String[] args) {
// 目标对象
IUserDao target = new UserDao();
// 【原始的类型 class cn.itcast.b_dynamic.UserDao】
System.out.println(target.getClass());
// 给目标对象,创建代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
// class $Proxy0 内存中动态生成的代理对象
}
}
运行结果:
开始事务…
—–已经保存数据!!!——
提交事务…