精华内容
下载资源
问答
  • 2020-11-05 11:10:22

    读此篇文章有感传送门

    一、web缓存的类型

    1. 数据库数据缓存

    Web应用,特别是SNS类型的应用,往往关系比较复杂,数据库表繁多,如果频繁进行数据库查询,很容易导致数据库不堪重荷。为了提供查询的性能,会将查询后的数据放到内存中进行缓存,下次查询时,直接从内存缓存直接返回,提供响应效率。比如常用的缓存方案有memcached等。

    2. 服务器端缓存

    2.1 代理服务器缓存

    代理服务器是浏览器和源服务器之间的中间服务器,浏览器先向这个中间服务器发起Web请求,经过处理后(比如权限验证,缓存匹配等),再将请求转发到源服务器。代理服务器缓存的运作原理跟浏览器的运作原理差不多,只是规模更大。可以把它理解为一个共享缓存,不只为一个用户服务,一般为大量用户提供服务,因此在减少相应时间和带宽使用方面很有效,同一个副本会被重用多次。常见代理服务器缓存解决方案有 Squid等,这里不再详述。

    2.2 CDN缓存

    CDN(Content delivery networks, 即内容分发网络。)缓存,也叫网关缓存、反向代理缓存。CDN缓存一般是由网站管理员自己部署,为了让他们的网站更容易扩展并获得更好的性能。浏览器先向CDN网关发起Web请求,网关服务器后面对应着一台或多台负载均衡源服务器,会根据它们的负载请求,动态将请求转发到合适的源服务器上。虽然这种架构负载均衡源服务器之间的缓存没法共享,但却拥有更好的处扩展性。从浏览器角度来看,整个CDN就是一个源服务器,从这个层面来说,本文讨论浏览器和服务器之间的缓存机制,在这种架构下同样适用。

    关于CDN缓存,在浏览器本地缓存失效后,浏览器会向CDN边缘节点发起请求。类似浏览器缓存,CDN边缘节点也存在着一套缓存机制。CDN边缘节点缓存策略因服务商不同而不同,但一般都会遵循http标准协议,通过http响应头中的

    Cache-control: max-age //后面会提到
    

    的字段来设置CDN边缘节点数据缓存时间。

    当浏览器向CDN节点请求数据时,CDN节点会判断缓存数据是否过期,若缓存数据并没有过期,则直接将缓存数据返回给客户端;否则,CDN节点就会向服务器发出回源请求,从服务器拉取最新数据,更新本地缓存,并将最新数据返回给客户端。 CDN服务商一般会提供基于文件后缀、目录多个维度来指定CDN缓存时间,为用户提供更精细化的缓存管理。

    2.3 DNS缓存

    全称 Domain Name System ,即域名系统

    万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。DNS协议运行在UDP协议之上,使用端口号53。

    简单的说,通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。

    www.dnscache.com (域名) - DNS解析 -> 11.222.33.444 (IP地址)
    

    有dns的地方,就有缓存。浏览器、操作系统、Local DNS、根域名服务器,它们都会对DNS结果做一定程度的缓存。

    DNS查询过程如下:

    1. 首先搜索浏览器自身的DNS缓存,如果存在,则域名解析到此完成。
    2. 如果浏览器自身的缓存里面没有找到对应的条目,那么会尝试读取操作系统的hosts文件看是否存在对应的映射关系,如果存在,则域名解析到此完成。
    3. 如果本地hosts文件不存在映射关系,则查找本地DNS服务器(ISP服务器,或者自己手动设置的DNS服务器),如果存在,域名到此解析完成。
    4. 如果本地DNS服务器还没找到的话,它就会向根服务器发出请求,进行递归查询。
      戳此处详细了解DNS解析过程

    3. 浏览器端缓存

    浏览器缓存根据一套与服务器约定的规则进行工作,在同一个会话过程中会检查一次并确定缓存的副本足够新。如果你浏览过程中,比如前进或后退,访问到同一个图片,这些图片可以从浏览器缓存中调出而即时显现。

    这里解释一下,HTML5时代所谓“浏览器”缓存有两部分:browser cache (浏览器缓存)和app cache(HTML5的离线应用缓存)戳此处去了解

    4. web应用层缓存

    应用层缓存指的是从代码层面上,通过代码逻辑和缓存策略,实现对数据,页面,图片等资源的缓存,可以根据实际情况选择将数据存在文件系统或者内存中,减少数据库查询或者读写瓶颈,提高响应效率。

    二、CDN的优势

    1. CDN节点解决了跨运营商和跨地域访问的问题,访问延时大大降低。
    2. 大部分请求在CDN边缘节点完成,CDN起到了分流作用,减轻了源服务器的负载。
      戳此处详细了解CDN工作过程

    三、浏览器缓存的优点

    1. 减少了冗余的数据传输

    2. 减少了服务器的负担,大大提升了网站的性能

    3. 加快了客户端加载网页的速度

    更多相关内容
  • 什么是动态代理? 假如我有一个user对象,该对象里面4个方法,增、删、改、查,外界能直接调用这4个方法吗?拿百度来说,你能随便对百度上的内容进行增、删、改、查操作吗?你最多能执行查的操作,增、删、改的...

    什么是动态代理?

    假如我有一个user对象,该对象里面有4个方法,增、删、改、查,外界能直接调用这4个方法吗?拿百度来说,你能随便对百度上的内容进行增、删、改、查操作吗?你最多能执行查的操作,增、删、改的操作是不能执行的,你必须要加一个权限操作,应该看看你是否有权限执行这个操作。同理,谁操作了这个东西,你需要给我留下记录,免得我不知道是谁做的。所以,我应该在每一个方法的前面加权限校验,在每一个方法的后面加日志记录。

    该怎么做呢?

    有人说,很简单,直接在user对象的实现类里面去改,在增、删、改查前面加上权限校验,在后面加上日志记录。你能随便改别人的代码吗?你一改,所以用过user对象的地方都要改,这不乱套了吗?

    有人说,可以再重新创建一个user对象,在新对象中加上权限校验和日志记录。确实是这样。但是如果我还有一个学生类,还有一个老师类...等等,你每一个都新创建一个对象的话,太麻烦了,而且没有必要,因为对我来说,我只关心对象的增、删、改、查操作,对于权限校验和日志记录我并不关心,这个时候,我们可以找中介来做权限校验和日志记录的事情,这个中介就是动态代理对象!

     

    动态代理

    代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象。

    举例:春季回家买票让人代买

    动态代理:在程序运行过程中产生的这个对象

    而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以,动态代理其实就是通过反射来生成一个代理

     

    在Java中java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过使用这个类和接口就可以生成动态代理对象。JDK提供的代理只能针对接口做代理。我们有更强大的代理cglib

    Proxy类中的方法创建动态代理类对象

    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

    最终会调用InvocationHandler的方法

    InvocationHandler

    Object invoke(Object proxy,Method method,Object[] args)

     

    代码如何来实现呢?

    package itcast_06;

     

    /*

     * 用户操作接口

     */

    public interface UserDao {

    public abstract void add();

     

    public abstract void delete();

     

    public abstract void update();

     

    public abstract void find();

    }

     

    package itcast_06;

     

    /**

     * 用户接口实现类

     * @author Administrator

     *

     */

    public class UserDaoImpl implements UserDao {

     

    @Override

    public void add() {

    System.out.println("添加功能");

    }

     

    @Override

    public void delete() {

    System.out.println("删除功能");

    }

     

    @Override

    public void update() {

    System.out.println("修改功能");

    }

     

    @Override

    public void find() {

    System.out.println("查找功能");

    }

    }

     

    package itcast_06;

     

    import java.lang.reflect.InvocationHandler;

    import java.lang.reflect.Method;

     

    //写一个类实现InvocationHandler接口

    public class MyInvocationHandler implements InvocationHandler {

    private Object target; // 目标对象

     

    public MyInvocationHandler(Object target) {

    this.target = target;

    }

     

    //重写invoke()方法

    public Object invoke(Object proxy, Method method, Object[] args)

    throws Throwable {

    System.out.println("权限校验");

    Object result = method.invoke(target, args);

    System.out.println("日志记录");

    return result; // 返回的是代理对象

    }

    }

     

    package itcast_06;

     

    import java.lang.reflect.Proxy;

     

    public class Test {

    public static void main(String[] args) {

    UserDao ud = new UserDaoImpl();

    ud.add();

    ud.delete();

    ud.update();

    ud.find();

    System.out.println("-----------");

    // 我们要创建一个动态代理对象

    // Proxy类中有一个方法可以创建动态代理对象

    // public static Object newProxyInstance(ClassLoader loader,Class<?>[]

    // interfaces,InvocationHandler h)

    // 我准备对ud对象做一个代理对象

    MyInvocationHandler handler = new MyInvocationHandler(ud);

    UserDao proxy = (UserDao) Proxy.newProxyInstance(ud.getClass()

    .getClassLoader(), ud.getClass().getInterfaces(), handler);

    proxy.add();

    proxy.delete();

    proxy.update();

    proxy.find();

     

    }

    }

     

    以上为JDK动态代理,只能针对接口做代理。我们有更强大的代理cglib。

    JDK动态代理依赖一个类和一个接口,分别是什么?

    答:Proxy类和InvocationHandler接口。

     

    调用Proxy类中的newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)方法可以创建一个动态代理对象,但是这个方法需要3个参数,前两个参数是固定的,但第三个参数比较麻烦,需要我们创建一个类MyInvocationHandler来实现InvocationHandler接口,这个类里面要重写invoke()方法。

     

    JDK动态代理和cglib动态代理有什么区别?

    答:JDK动态代理智能对实现了接口的类生成代理对象;

    cglib可以对任意类生成代理对象,它的原理是对目标对象进行继承代理,如果目标对象被final修饰,那么该类无法被cglib代理。

     

    Spring框架的一大特点就是AOP,SpringAOP的本质就是动态代理,那么Spring到底使用的是JDK代理,还是cglib代理呢?

    答:混合使用。如果被代理对象实现了接口,就优先使用JDK代理,如果没有实现接口,就用用cglib代理。

     

    动态代理的应用

    AOP(Aspect-OrientedProgramming,面向切面编程),AOP包括切面(aspect)、通知(advice)、连接点(joinpoint),实现方式就是通过对目标对象的代理在连接点前后加入通知,完成统一的切面操作。

    实现AOP的技术,主要分为两大类:

    一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

    二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。

    Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。

    默认的策略是如果目标类是接口,则使用JDK动态代理技术,如果目标对象没有实现接口,则默认会采用CGLIB代理。

    如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。

    JDK动态代理

    1、因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有。 
    2、生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。 
    3、利用JDKProxy方式必须有接口的存在。 
    4、invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型。

    cglib动态代理

    1、 CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 
    2、 用CGlib生成代理类是目标类的子类。 
    3、 用CGlib生成 代理类不需要接口 
    4、 用CGLib生成的代理类重写了父类的各个方法。 
    5、 拦截器中的intercept方法内容正好就是代理类中的方法体

    spring两种代理方式

    1. 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。 
    优点:因为有接口,所以使系统更加松耦合 
    缺点:为每一个目标类创建接口

    2. 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。 
    优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。 
    缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。

    展开全文
  • 动态代理的两方式以及区别

    万次阅读 多人点赞 2018-09-19 12:37:09
    动态代理的两方式,以及区别。 JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将...

    JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。
    CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

    区别:JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。

    强制使用CGlib

    <!-- proxy-target-class="false"默认使用JDK动态代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    
    <aop-config proxy-target-class="true">
    <!-- 切面详细配置 -->
    </aop-config>
    

    具体代码示例:

    /**
     * 目标接口类
     */
    public interface UserManager {    
        public void addUser(String id, String password);    
        public void delUser(String id);    
    }
    
    /**
     * 接口实现类
     */
    public class UserManagerImpl implements UserManager {    
        
        @Override
        public void addUser(String id, String password) {    
            System.out.println("调用了UserManagerImpl.addUser()方法!");
        }    
        
        @Override
        public void delUser(String id) {    
            System.out.println("调用了UserManagerImpl.delUser()方法!");
        }    
    }
    
    /**
     * JDK动态代理类
     */
    public class JDKProxy implements InvocationHandler {    
        
        // 需要代理的目标对象
        private Object targetObject;    
        
        public Object newProxy(Object targetObject) {
            // 将目标对象传入进行代理    
            this.targetObject = targetObject;
            // 返回代理对象 
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(), targetObject.getClass().getInterfaces(), this);
        }    
        
        // invoke方法
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 进行逻辑处理的函数
            checkPopedom();
            Object ret = null;
            // 调用invoke方法
            ret = method.invoke(targetObject, args);
            return ret;
        }    
        
        private void checkPopedom() {
            // 模拟检查权限   
            System.out.println("检查权限:checkPopedom()!");    
        }    
    } 
    
    /**
     * CGlib动态代理类
     */
     public class CGLibProxy implements MethodInterceptor {    
        
        // CGlib需要代理的目标对象
        private Object targetObject;
        
        public Object createProxyObject(Object obj) {
            this.targetObject = obj;
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(obj.getClass());
            enhancer.setCallback(this);
            Object proxyObj = enhancer.create();
            return proxyObj;
        }
        
        @Override
        public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
            Object obj = null;
            // 过滤方法
            if ("addUser".equals(method.getName())) {
                // 检查权限
                checkPopedom();
            }
            obj = method.invoke(targetObject, args);
            return obj;
        }    
        
        private void checkPopedom() {
            System.out.println("检查权限:checkPopedom()!");
        }
    }
    
    /**
     * 测试类
     */
    public class ProxyTest {
        
        public static void main(String[] args) {
            UserManager userManager = (UserManager)new CGLibProxy().createProxyObject(new UserManagerImpl());
            System.out.println("CGLibProxy:");
            userManager.addUser("tom", "root");
            System.out.println("JDKProxy:");
            JDKProxy jdkProxy = new JDKProxy();
            UserManager userManagerJDK = (UserManager)jdkProxy.newProxy(new UserManagerImpl());
            userManagerJDK.addUser("tom", "root");
        }
    }
    
    // 运行结果
    CGLibProxy:
    检查权限checkPopedom()!
    调用了UserManagerImpl.addUser()方法!
    JDKProxy:
    检查权限checkPopedom()!
    掉用了UserManagerImpl.addUser()方法!
    

    总结:1.JDK代理使用的是反射机制实现aop的动态代理,CGLIB代理使用字节码处理框架asm,通过修改字节码生成子类。所以jdk动态代理的方式创建代理对象效率较高,执行效率较低,cglib创建效率较低,执行效率高;2.JDK动态代理机制是委托机制,具体说动态实现接口类,在动态生成的实现类里面委托hanlder去调用原始实现类方法,CGLIB则使用的继承机制,具体说被代理类和代理类是继承关系,所以代理类是可以赋值给被代理类的,如果被代理类有接口,那么代理类也可以赋值给接口。

    展开全文
  • 从程序清单 3-1 中我们可以看得出,代理的模式和组合有点类似,但又差别——代理成功的隔开了新类(会员)和已类(店铺)的直接关系,使得已类的方法不直接暴露在新类面前(组合的方式会将已类的非private的...

    复用代码是 Java 众多引人注目的功能之一。这句话很通顺,没什么问题,但问题在于很多人并不清楚“复用”是什么。就好像我说“沉默王二是一个有趣的程序员”,唉,沉默王二是谁?

    我们需要来给“复用”下一个定义。复用,说白了就是重复使用。

    举个例子,很多名人说了很多名言,我们在说话、写作的时候,就经常有意无意的重复这些名言。比如说我,就特别喜欢重复使用王小波的那句名言:“从话语中,你很少能学到人性,从沉默中却能。假如还想学得更多,那就要继续一声不吭 。”

    上面这个例子,只能说是“复用”的一种低级的应用,其实就是复制粘贴了。还有高级的复用方式吗?

    有,当然有。Java 作为一种优秀的面向对象设计的语言,在复用的应用上就高级得多了。

    01、继承

    最常见的复用方法就是继承——使用 extends 关键字在基类的基础上创建新类,新类可以直接复用基类的非 private 的属性和方法;就像程序清单1-1那样。

    程序清单1-1:

    public class Wangxiaosan extends Wangsan {
    	public Wangxiaosan() {
    		System.out.println("我是新类王小三");
    		
    		setName("王老三");
    		
    		System.out.println(getName());
    	}
    	
    	public static void main(String[] args) {
    		new Wangxiaosan();
    	}
    }
    
    class Wangsan {
    	private String name;
    
    	Wangsan() {
    		System.out.println("我是基类王三");
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    }
    

    从程序清单 1-1 中我们可以看得出,getName() 和 setName() 方法虽然是在基类 Wangsan 中创建的,但可以在新类 Wangxiaosan 中使用,代码的复用工作就这样轻松地完成了。

    02、组合

    另外一种常见的复用方法就是组合——在新类中创建已有类的对象,通过该对象来调用已有类中的非 private 的属性和方法;就像程序清单2-1那样。

    程序清单2-1:

    public class Tongxiangyu {
    	private Baizhantang boyFriend = new Baizhantang();
    
    	public Tongxiangyu() {
    		System.out.println("我是同福客栈的掌柜佟湘玉");
    
    		boyFriend.pointHand("郭芙蓉");
    	}
    
    	public static void main(String[] args) {
    		new Tongxiangyu();
    	}
    }
    
    class Baizhantang {
    	Baizhantang() {
    		System.out.println("我是退隐江湖的盗圣白展堂");
    	}
    
    	public void pointHand(String name) {
    		System.out.println("那谁" + name + ",准备一下——葵花点穴手");
    	}
    }
    

    从程序清单 2-1 中我们可以看得出,葵花点穴手虽然是白展堂的绝技,但作为佟掌柜的男朋友,佟掌柜要展堂点个穴,展堂也是不敢推辞的。你看,佟掌柜虽然是个弱女子,但自从有了展堂这个武功数一数二的男朋友,再没有谁敢不听话啊——厉害的组合啊。

    需要注意的是,如何在继承和组合之间做出选择呢?

    如果新类和已有类需要具有一些相似的方法和属性时,就采用继承的形式;如果新类只是为了借用已有类的一些方法和属性时,而两者没有很多相似之处时就需要采用组合的形式。

    03、 代理

    还有一种复用方法是代理——在新类中创建代理,通过代理来操作已有类的非 private 的属性和方法;就像程序清单 3-1 那样。

    程序清单3-1:

    public class Member {
    	public static void main(String[] args) {
    		Proxy proxy = new Proxy();
    		System.out.println("代理说一个药丸十五块");
    		proxy.buy(15);
    	}
    }
    
    class Proxy {
    	private Shop shop = new Shop();
    
    	public void buy(int money) {
    		System.out.println("一个药丸十五块");
    		shop.sale(money - 5);
    	}
    }
    
    class Shop {
    	public void sale(int money) {
    		System.out.println("一个药丸十块钱");
    	}
    }
    

    从程序清单 3-1 中我们可以看得出,代理的模式和组合有点类似,但又有差别——代理成功的隔开了新类(会员)和已有类(店铺)的直接关系,使得已有类的方法不直接暴露在新类面前(组合的方式会将已有类的非private的方法和属性直接暴露在新类中);与此同时,代理拿到了足够的好处。

    04、final

    作为代码的生产者来说,我们有时候希望代码被复用,有的时候又希望代码不被复用。当我们不想代码被复用时,final 关键字就派上用场了。final 这个关键字很形象,它本身就说明了一切——最后的,最终的;决定性的;不可更改的。

    使用 final 的场景有三种,分别是数据、方法和类。我们来稍作说明。

    1)final 数据

    最常见的 final 数据就是常量了,例如:

    public class Consts {
    	public static final String CMOWER = "沉默王二";
    }
    

    对于常量来说,它对于整个应用内的所有类都是可见的,因此是 public 的;它可以直接通过类名.常量名访问,所以是 static 的;它是不可修改的,因此是 final 的。

    另外一种常见的 final 数据就是参数了,参照程序清单 4-1。

    程序清单4-1:

    public class Cmower {
    
    	public void write(final String content) {
    		// content += "犹未雪"; // final修饰的参数是无法在方法内部被再次修改的
    		System.out.println(content);
    	}
    
    	public void write1(String content) {
    		content += "犹未雪";
    		System.out.println(content);
    	}
    
    	public static void main(String[] args) {
    		Cmower cmower = new Cmower();
    		cmower.write("精忠报国");
    		cmower.write1("靖康耻");
    	}
    }
    

    2)final 方法

    在 Java 类中,所有的 private 方法都隐式地指定为 final 的(也就是说,如果你在 private 方法上加上 final 修饰符,其实是没啥意义的)。在介绍继承的时候,你应该注意到我强调的一句话,就是新类可以直接复用基类的非 private 的属性和方法,也就是说 private 方法是无法被继承者修改的,因为 private 方法是 final 的。

    来看程序清单 4-2,你会发现 Wangsan 类型的 san 引用是不能调用 say(String words) 方法的,因为 private 方法是无法被继承者修改的,尽管 Wangxiaosan 中重新定义了 say(String words) 方法。

    程序清单4-2:

    public class Wangxiaosan extends Wangsan {
    	public Wangxiaosan() {
    		say("吃中饭没");
    	}
    
    	public void say(String words) {
    		System.out.println("王小三在说:" + words);
    	}
    
    	public static void main(String[] args) {
    		Wangsan san = new Wangxiaosan();
    		// san.say("吃晚餐没"); // 无法访问,并不会被覆盖
    	}
    }
    
    class Wangsan {
    	public Wangsan() {
    		say("吃早饭没");
    	}
    
    	private void say(String words) {
    		System.out.println("王三在说:" + words);
    	}
    }
    

    3)final 类

    当我们认为某个类就是最终的形态了,它很完美,不应该被继承,就可以使用final关键字来修饰;参照程序清单 4-3。

    程序清单 4-3:

    // 无法继承
    public class Wangxiaosan extends Wangsan {
    }
    
    final class Wangsan {
    	public Wangsan() {
    		System.out.println("我就是最终形态,别继承我!");
    	}
    }
    

    上一篇:Java 访问权限控制:public、private、protected

    下一篇:Java:多态乃幸福本源

    微信搜索「沉默王二」公众号,关注后回复「免费视频」获取 500G Java 高质量教学视频(已分门别类)。

    展开全文
  • nginx做代理服务器的几种简单配置

    千次阅读 2018-11-24 17:04:00
    首先要知道nginx的代理相对于lvs不同是七层的代理,报文在流经PREROUTING时发现对方的目标IP是自己会将数据发往应用层,nginx的proxy模块会将数据解析然后以自己的ip地址为源地址发送给被代理的服务器。所以返回的...
  • Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    万次阅读 多人点赞 2017-02-10 14:04:59
    代理模式代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象...
  • js的几种设计模式

    千次阅读 2021-01-11 15:52:40
    4、代理模式 代理对象可以代替本体被实例化,并使其可以被远程访问 demo: 虚拟代理实现图片的预加载 5、缓存代理 缓存代理的含义就是对第一次运行时候进行缓存,当再一次运行相同的时候,直接从缓存里面取,这样做...
  • 负载均衡的几种常见方式

    万次阅读 2018-08-02 00:26:07
    代理与反向代理:VPN服务就是我们常用的一种代理(正向代理),用户将请教交给代理服务器,代理服务器访问网站获取数据,之后代理服务器再将数据返还给用户。在这个过程中,应用服务器并不知道用户的存在。只知道...
  • 常用的几种设计模式详解

    千次阅读 2021-04-09 15:01:27
    特点是将对象的创建与使用分离(解耦), 单例、原型、工厂方法、抽象工厂、建造者等5。 结构型模式 用于描述如何将类或对象按某种布局组成更大的结构,代理、适配器、桥接、装饰、享元、组合等7。 行为型...
  • 代理模式是常用的java设计模式,他的特征是代理类与委托类同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...
  • 几种常用的网络传输协议

    千次阅读 2019-10-07 10:36:08
    简单的说就是规定了个位或个字节表示一个数据. (3)网络层——Network  网络层属于OSI中的较高层次了,从它的名字可以看出,它解决的是网络与网络之间,即网际的通信问题,而不是同一网段内部的事。网络层的...
  • Spring/Boot/Cloud系列知识(2)——代理模式

    千次阅读 多人点赞 2017-09-15 11:24:54
    代理模式是23设计模式中的一,属于一结构模式。用一句大白话解释这个设计模式:当外部调用者调用A来完成一件事情/一个动作时,并不直接调用A本身,而是调用一个代理者,并再由代理者负责调用真实的执行者A,...
  • Vue中的刷新的几种方法

    千次阅读 2020-07-21 06:48:26
    1.场景 在处理列表时,常常删除一条数据或者新增数据之后需要...作用:允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次多深,并在起上下游关系成立的时间里始终生效。 在app.vue里添加: <r
  • Pr:使用代理

    千次阅读 2021-01-05 00:00:00
    如果电脑性能不够,在剪辑工作中经常出现严重的卡顿现象,就应该考虑使用代理来解决。将原始素材转码生成低分辨率媒体,剪辑时使用它来替代原始媒体。代理文件与原始文件之间存在链接对应关系,因此不...
  • jdk动态代理使用详解

    万次阅读 多人点赞 2022-06-18 20:07:13
    jdk动态代理和cglib静态代理使用详解
  • 单一职责原则:就一个类仅一个引起它变化的原因,即类承担的职责单一性; 开放封闭原则:类、模块、函数等应该是可以扩展的,但是不可修改。换句话说,就是面对需求的改变要尽可能地保证相对稳定,尽量通过扩展...
  • 轻松学,Java 中的代理模式及动态代理

    万次阅读 多人点赞 2017-06-29 22:08:55
    天我写了《秒懂,Java 注解 (Annotation)你可以这样学》,因为注解其实算反射技术中的一部分,然后我想了一下,反射技术中还有个常见的概念就是动态代理,于是索性再写一篇关于动态代理的博文好了。...
  • 深入理解 http 反向代理(nginx)

    千次阅读 多人点赞 2022-02-09 14:53:20
    要理解什么是反向代理(reverse proxy), 自然你得先知道什么是正向代理(forward proxy). 另外需要说的是, 一般提到反向代理, 通常是指 http 反向代理, 但反向代理的范围可以更大, 比如 tcp 反向代理, 在这里, 不打算...
  • Shell判断字符串包含关系几种方法

    万次阅读 2017-05-02 17:46:25
    Shell判断字符串包含关系几种方法
  • 几种常见架构模式

    万次阅读 多人点赞 2016-07-18 13:57:57
    6.2.2 几种常见架构模式 前文讲过,在实践中,人们总结出了一些常用的软件系统结构高层模式,以供应用系统设计时参考。这些模式包括:单服务两层/多层C/S;MVC结构;面向服务的SOA与多服务集合;数据交换总线等。 ...
  • 端口映射的几种方式

    千次阅读 2017-10-15 14:10:31
    端口映射动态和静态之分。端口映射是将一台主机的内网(LAN)IP地址映射成一个公网(WAN)IP地址,当用户访问提供映射端口主机的某个端口时,服务器将请求转移到本地局域网内部提供这种特定服务的主机;利用端口映射...
  • Android Hook Activity 的几种姿势

    万次阅读 多人点赞 2018-08-06 19:35:28
    这篇博客已 API 27 的源码为基础分析 前言 在上一篇文章中,我们介绍了 Hook 的要点 Hook 的选择点:静态变量和...选择合适的代理方式,如果是接口可以用动态代理。 偷梁换柱——用代理对象替换原始对象。 And...
  • 前端开发中常用的几种设计模式

    万次阅读 多人点赞 2021-08-17 15:05:54
    设计模式更多的是指导思想和方法论,而不是现成的代码,当然每设计模式都语言中的具体实现方式。学习设计模式更多的是理解各种模式的内在思想和解决的问题,毕竟这是前人无数经验总结成的最佳实践,而代码...
  • 常见的几种设计模式

    千次阅读 多人点赞 2019-02-28 09:45:27
    文章目录单例模式为什么会单例设计模式?应用spring中IOC解决的问题设计思想工厂模式简单工厂模式工厂方法模式观察者模式观察者模式的定义装饰模式模板方法定义:主要的作用:优点:缺点:应用场景:适配器模式...
  • 第2章 数据库关系模型---数据库与机器学习 作业 常用的关系查询操作包括选择、投影、连接、并、交等。 v 实体完整性是指关系表的属性... 代理键是为了唯一标识关系的不同元组,需要在表单或报表中显示出来。 x ...
  • 几种常用的设计模式

    万次阅读 多人点赞 2014-12-03 17:03:46
    设计模式(Design Patterns)  ——可复用面向对象软件的基础 ...创建型模式,共五:工厂方法模式、抽象工厂模式、...结构型模式,共七:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、
  • 超全MyBatis动态代理详解!(绝对干货)

    千次阅读 多人点赞 2021-01-20 09:30:23
    我的新课《C2C 电商系统微服务架构120天实战训练营》在公众号儒猿技术窝上线了,感兴趣的同学,可以长按扫描下方二维码了解课程详情:课程大纲请参见文末前言假如人问你这么个问题,看能不...
  • ES6之Proxy代理

    万次阅读 2019-12-20 23:17:43
    什么是Proxy代理 ...人话是:把代理看做是设计模式代理模式中的一一个代理对象来代理本体,而ES6的Proxy牛逼的一点是可以把本体没法改变的内部属性改了 代理与反射是什么? 通过调用 new Pro...
  • Http request的几种类型。

    千次阅读 2018-04-15 21:06:56
    1. OPTIONS:允许客户端查看服务器的性能。 2. HEAD:类似于get请求,只不过返回的响应中没有具体的内容...POST请求可能会导致新的资源的创建和/或已资源的修改。 5. PUT:向指定资源位置上传其最新内容。 6...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 199,835
精华内容 79,934
关键字:

代理关系有哪几种

友情链接: socketwin.rar