代理模式--JDK动态代理

1.spring配置文件有问题添加 <?xml version="1.0" encoding="UTF-8"?> 有时候其他地方复制过来依然会报错,使用模板自己创建一个。

警告: Ignored XML validation warning
org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 77; 
schema_reference.
4: 无法读取方案文档 'https://www.springframework.org/schema/beans/spring-beans.xsd', 原因为 
1) 无法找到文档; 
2) 无法读取文档; 
3) 文档的根元素不是 <xsd:schema>。

2.提交事务的时候,先要将自动提交关闭:autocommit=false

java.sql.SQLException: Can't call commit when autocommit=true

3.@Test相当于main函数,@Test只有一个线程,将连接对象用线程绑定起来
在这里插入图片描述

ThreadLocal<T>

在这里插入图片描述
在这里插入图片描述
将当前连接对象移除当前线程绑定
在这里插入图片描述

事务和线程是两个概念,同一个线程不影响事务的提交
在这里插入图片描述
类加载器(ClassLoader):用来加载字节码文件
动态代理
* 在程序运行过程中进行代理
* 特点:使用字节码的形式,加载创建
* 作用:不修改源码对方法进行改进
* 分类:JDK动态代理和Cglib动态代理
* JDK动态代理:Proxy
* 被代理对象必须实现某个接口
* Proxy.newProxyInstance(ClassLoader,class[] args,InvocationHandler)
* ClassLoader:需要被代理对象的类加载器

import com.tedu.entity.Iproducer;
import com.tedu.entity.Producer;
import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Client {
    @Test
    public void test(){
        /**
         * 动态代理
         *  在程序运行过程中进行代理
         *  特点:使用字节码的形式,加载创建
         *  作用:不修改源码对方法进行改进
         *  分类:JDK动态代理和Cglib动态代理
         *      JDK动态代理:Proxy
         *  被代理对象必须实现某个接口
         *   Proxy.newProxyInstance(ClassLoader,class[] args,InvocationHandler)
         *   ClassLoader:需要被代理对象的类加载器
         *
         */
        //被代理对象
        final Producer producer  = new Producer();
        //获取代理对象
        Iproducer producerProxy = (Iproducer)Proxy.newProxyInstance(producer.getClass().getClassLoader(), producer.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                /**
                 * proxy代理对象的引用
                 * method代理对象执行的方法
                 * args代理对象执行方法所需的参数
                 */
                Object value = null;
                        Double money = (Double)args[0];
                if(method.getName().equals("saleAfter")){
                    value = method.invoke(producer, money * 2);
                }
                return value;
            }
        });
//        producerProxy.salePhone(1000);
        producerProxy.saleAfter(300);
    }
}

发布了242 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/shujuku____/article/details/105282899
今日推荐