首页 > 其他分享 >9_Spring_JDK动态代理

9_Spring_JDK动态代理

时间:2023-03-03 14:46:19浏览次数:40  
标签:name JDK Spring void 代理 println public String

 代理模式
是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。
房产中介代替业主卖房

 

静态代理
                                静态代理中代理类与被代理类都需要实现同一个接口,这就说明我们的一个静态代理类只能代理一个类,并且还要事先知道我们要代理哪个类才能写代理类,如果我们有其他类还想使用代理那就必须再写一个代理类。然而在实际开发中我们是可能是有非常多的类是需要被代理的,并且事先我们可能并不知道我们要代理哪个类。所以如果继续使用静态代理反而会增加许多的工作量,并且效率低下,代码复用率也不好。

 

package com.msb.test;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public class Test1 {
    public static void main(String[] args) {
        Person person =new Person("张三");
        Court court=new Lawyer(person);
        court.doCourt();
    }
}
// 接口
interface Court{
    void doCourt();
}
// 代理类
class Lawyer implements Court{
    private Person person;
    public Lawyer(Person person) {
        this.person = person;
    }
    @Override
    public void doCourt() {
        System.out.println("律师取证:视频证明张三当时正在旅游,不在案发现场");
        System.out.println("律师总结:张三不可能去杀人");
        person.doCourt();
    }
}
// 被代理的类
class Person implements Court{
    private String name;
    public Person(String name) {
        this.name = name;
    }
    @Override
    public void doCourt() {
        System.out.println(name+"说:我没有杀人");
    }
}

 

 

动态代理
                                动态代理可以针对于一些不特定的类或者一些不特定的方法进行代理,我们可以在程序运行时动态的变化代理的规则,代理类在程序运行时才创建的代理模式成为动态代理。这种情况下,代理类并不是在Java代码中定义好的,而是在程序运行时根据我们的在Java代码中的“指示”动态生成的
                         Proxy  动态代理 JDK动态代理         面向接口
      cglib    动态代理 第三方动态代理    面向父类

张三吃饭
 

package com.msb.testProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
/**
 * @Author: Ma HaiYang
 * @Description: MircoMessage:Mark_7001
 */
public class Test1 {
    public static void main(String[] args) {
        Dinner dinner=new Person("张三");
        // 通过Porxy动态代理获得一个代理对象,在代理对象中,对某个方法进行增强
//        ClassLoader loader,被代理的对象的类加载器
        ClassLoader classLoader = dinner.getClass().getClassLoader();
//        Class<?>[] interfaces,被代理对象所实现的所有接口
        Class[] interaces= dinner.getClass().getInterfaces();
//        InvocationHandler h,执行处理器对象,专门用于定义增强的规则
        InvocationHandler handler = new InvocationHandler(){
            // invoke 当我们让代理对象调用任何方法时,都会触发invoke方法的执行
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//                Object proxy, 代理对象
//                Method method,被代理的方法
//                Object[] args,被代理方法运行时的实参
                Object res=null;
               if(method.getName().equals("eat")){
                   System.out.println("饭前洗手");
                   // 让原有的eat的方法去运行
                   res =method.invoke(dinner, args);
                   System.out.println("饭后刷碗");
               }else{
                   // 如果是其他方法,那么正常执行就可以了
                   res =method.invoke(dinner, args);
               }
                return res;
            }
        };
        Dinner dinnerProxy =(Dinner) Proxy.newProxyInstance(classLoader,interaces,handler);
        //dinnerProxy.eat("包子");
        dinnerProxy.drink();
    }
}
interface Dinner{
    void eat(String foodName);
    void drink();
}
class Person implements Dinner{
    private String name;
    public Person(String name) {
        this.name = name;
    }
    @Override
    public void eat(String foodName) {
        System.out.println(name+"正在吃"+foodName);
    }
    @Override
    public void drink( ) {
        System.out.println(name+"正在喝茶");
    }
}
class Student implements Dinner{
    private String name;
    public Student(String name) {
        this.name = name;
    }
    @Override
    public void eat(String foodName) {
        System.out.println(name+"正在食堂吃"+foodName);
    }
    @Override
    public void drink( ) {
        System.out.println(name+"正在喝可乐");
    }
}

 


使用代理技术 获得代理对象 代替张三  增强打官司的方法

总结

1在不修改原有代码的 或者没有办法修改原有代码的情况下  增强对象功能  使用代理对象 代替原来的对象去完成功能
进而达到拓展功能的目的
2JDK Proxy 动态代理面向接口的动态代理  一定要有接口和实现类的存在 代理对象增强的是实现类 在实现接口的方法重写的方法   
   生成的代理对象只能转换成 接口的不能转换成 被代理类
   代理对象只能增强接口中定义的方法  实现类中其他和接口无关的方法是无法增强的
   代理对象只能读取到接口中方法上的注解 不能读取到实现类方法上的注解

 

标签:name,JDK,Spring,void,代理,println,public,String
From: https://www.cnblogs.com/2324hh/p/17175584.html

相关文章

  • 9_Spring_JDK动态代理
    ​ 代理模式是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。房产中介代替业主卖房 静态代理     ......
  • SpringBoot接口返回统一格式
    packagecom.example.springboot.common;importorg.springframework.core.MethodParameter;importorg.springframework.http.MediaType;importorg.springframework......
  • Fleet Spring Boot
    前言Fleet是JetBrains的一款新的IDE,包罗万象(夸张)。示例项目在,有一个父项目和多个子项目构成菜单Run菜单Run&Debug点击创建run.json文件内容:{ "configur......
  • 第十三节:跨域产生的原因及常用跨域方案的总结(同源部署、CORS、代理、Nginx等)
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblog......
  • springboot整合mybatis
    1,引入依赖<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version><scope>runtime</scope></depend......
  • SpringBoot集成Knife4j
    转载自: SpringBoot集成Knife4j-hviger-博客园(cnblogs.com)Knife4j简介Knife4j官网地址:https://doc.xiaominfo.com/knife4j是为JavaMVC框架集成Swagger生成Ap......
  • 一文解读业务平台升级JDK11的适配之路
    本文基于两个出发点,描述了业务平台于21年12月启动了对JDK版本升级的适配之路,并回顾了整个升级过程,对升级过程中的问题做了记录。业务平台升级JDK11,基于两个出发点:一、jdk......
  • 手写模拟Spring底层原理-Bean的创建与获取
    作者:京东物流张鼎元1引言大家好,相信大家对Spring的底层原理都有一定的了解,这里我们会针对Spring底层原理,在海量的Spring源代码中进行抽丝剥茧手动实现一个Spring简易版......
  • Spring Boot | 手动创建一个简单的Spring Boot项目
    在上一章《00.创建多模块项目》中,笔者汪小成已经创建了一个空的01.spring-boot-hello子工程。本章中笔者汪小成开始着手编写一个简单地SpringBoot项目主启动类。本篇文章......
  • 从源码MessageSource的三个实现出发实战spring·i18n国际化
    1.前言互联网业务出海,将已有的业务CopytoGlobal,并且开始对各个国家精细化,本土化的运营。对于开发人员来说,国际化很重要,在实际项目中所要承担的职责是按照客户指定的语言......