public class DynamicProxyHandler {
//被代理的对象
private Object target;
//事务管理器
private TransactionManagerHandler txManager;
/**
* 返回一个代理对象,代理对象就做了方法的增强,(事物管理,日志控制,权限管理等等)
*/
public <T> T getProxyObject(Class<T> clz) {
/*
* JDK内置有一个代理类,专门负责创建动态代理对象的,类
* Proxy 类 , Proxy为被代理的对象创建代理对象
* 理论上创建被代理对象,是需要被代理对象的类对应的字节码的
* Proxy 在JVM动态的创建被代理对象的字节码,冬天的创建代理对象
*/
/*
* loader: 类加载器,类加载器就是从当前classpath下面加载字节码,在整个应用有且只有一个类加载器
* 如何或者类加载器,
* 方式一: 使用当前线程
* ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
* 方式二: 使用任何一个类的字节码
* target.getClass().getClassLoader()
* interfaces : 被代理对象的接口
* h : 处理器: 真正做代码增强的地方
*/
//代理对象
Object newProxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
/**
* 代理内的增强方法,正常增强的地方
* @param proxy 代理对象
* @param method 被代理对象的方法
* @param args 被代理对象方法的参数
* @return 被代理对象执行的结果
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//执行被代理对象的方法
Object result = null;
try {
//方法之前执行操作
//开始事务
txManager.begin();
result = method.invoke(target, args);
//方法之后执行操作
//提交事物
txManager.commit();
} catch (Exception e) {
//回滚事物
txManager.rollback();
}finally {
txManager.close();
}
return result;
}
});
//返回代理对象
return (T) newProxyInstance;
}
public void setTarget(Object target) {
this.target = target;
}
public void setTxManager(TransactionManagerHandler txManager) {
this.txManager = txManager;
}
}
配置文件
<!-- 配置事物管理器 -->
<bean id="txMananger" class="cn.zj.spring.TransactionManagerHandler"/>
<!-- 配置动态代理类 -->
<bean id="dynamicProxy" class="cn.zj.spring.proxy.DynamicProxyHandler">
<!-- 注入事物管理器 -->
<property name="txManager" ref="txMananger"/>
<!-- 配置被代理对象 -->
<property name="target">
<bean class="cn.zj.spring.service.impl.UserServiceImpl"/>
</property>
</bean>
测试代码
@RunWith(SpringJUnit4ClassRunner.class) // 表示先启动Spring容器,把junit运行在Spring容器中
@ContextConfiguration("classpath:applicationContext.xml") // 读取Spring的配置文件
public class DynamicProxyTest {
// 自动注入 UserService
@Autowired
private DynamicProxyHandler proxy;
@Test
public void testInsert() throws Exception {
// 获取代理类对象的中的获取动态代理对象的方法
UserService proxyObject = proxy.getProxyObject(UserServiceImpl.class);
proxyObject.insert("张三");
}
@Test
public void testUpdate() throws Exception {
// 获取代理类对象的中的获取动态代理对象的方法
UserService proxyObject = proxy.getProxyObject(UserServiceImpl.class);
proxyObject.update("李四");
}
}