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("李四"); } }
原文:https://www.cnblogs.com/cqming/p/11000455.html