zoukankan      html  css  js  c++  java
  • spring jdk动态代理

    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("李四");
    	}
    }
    

      

  • 相关阅读:
    Java接口自动化测试实战001----get、post方法实现与封装
    临近年关,两个磁盘占满引起的服务下线
    Abp小试牛刀之 图片上传
    Abp vNext异常处理的缺陷/改造方案
    Oh my God, Swagger API文档竟然可以这样写?
    【C#】DockPanelSuite 中 DockState.Document 状态下子窗体控件不显示的解决方案
    环境系列——cygwin启动flink
    环境系列——window10环境下编译Flink源码编译
    弱肉强食——《哆啦A梦:大雄的新恐龙》观后感
    bilibili插件推荐
  • 原文地址:https://www.cnblogs.com/cqming/p/11000455.html
Copyright © 2011-2022 走看看