您的位置:首页 > 编程语言 > Java开发

初始spring(八)

2016-08-08 15:51 120 查看

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   内存中动态生成的代理对象

}
}


运行结果:

开始事务…

—–已经保存数据!!!——

提交事务…
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: