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

9_Spring_JDK动态代理

时间:2023-07-30 12:46:08浏览次数:38  
标签:name JDK Spring void 代理 println public String

9_Spring_JDK动态代理

代理模式

是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。

房产中介代替业主卖房

image

静态代理

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

  1. package com.msb.test;
  2. /**
    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  3. */
  4. public class Test1 {
  5.  public static void main(String[] args) {
    
  6.      Person person =new Person("张三");
    
  7.      Court court=new Lawyer(person);
    
  8.     court.doCourt();
    
  9. }
    
  10. }
  11. // 接口
  12. interface Court{
  13. void doCourt();
    
  14. }
  15. // 代理类
  16. class Lawyer implements Court{
  17. private Person person;
    
  18. public Lawyer(Person person) {
    
  19.     this.person = person;
    
  20. }
    
  21. @Override
    
  22. public void doCourt() {
    
  23.     System.out.println("律师取证:视频证明张三当时正在旅游,不在案发现场");
    
  24.     System.out.println("律师总结:张三不可能去杀人");
    
  25.     person.doCourt();
    
  26. }
    
  27. }
  28. // 被代理的类
  29. class Person implements Court{
  30. private String name;
    
  31. public Person(String name) {
    
  32.     this.name = name;
    
  33. }
    
  34. @Override
    
  35. public void doCourt() {
    
  36.     System.out.println(name+"说:我没有杀人");
    
  37. }
    
  38. }

动态代理

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

cglib    动态代理 第三方动态代理    面向父类

张三吃饭

  1. package com.msb.testProxy;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import java.util.Arrays;
  6. /**
    • @Author: Ma HaiYang
    • @Description: MircoMessage:Mark_7001
  7. */
  8. public class Test1 {
  9. public static void main(String[] args) {
    
  10.     Dinner dinner=new Person("张三");
    
  11.     // 通过Porxy动态代理获得一个代理对象,在代理对象中,对某个方法进行增强
    
  12. // ClassLoader loader,被代理的对象的类加载器
  13.     ClassLoader classLoader = dinner.getClass().getClassLoader();
    
  14. // Class<?>[] interfaces,被代理对象所实现的所有接口
  15.     Class[] interaces= dinner.getClass().getInterfaces();
    
  16. // InvocationHandler h,执行处理器对象,专门用于定义增强的规则
  17.     InvocationHandler handler = new InvocationHandler(){
    
  18.         // invoke 当我们让代理对象调用任何方法时,都会触发invoke方法的执行
    
  19.         public Object invoke(Object proxy, Method method, Object[]
    
    args) throws Throwable {
  20. // Object proxy, 代理对象
  21. // Method method,被代理的方法
  22. // Object[] args,被代理方法运行时的实参
  23.             Object res=null;
    
  24.            if(method.getName().equals("eat")){
    
  25.                System.out.println("饭前洗手");
    
  26.                // 让原有的eat的方法去运行
    
  27.                res =method.invoke(dinner, args);
    
  28.                System.out.println("饭后刷碗");
    
  29.            }else{
    
  30.                // 如果是其他方法,那么正常执行就可以了
    
  31.                res =method.invoke(dinner, args);
    
  32.            }
    
  33.             return res;
    
  34.         }
    
  35.     };
    
  36.     Dinner dinnerProxy =(Dinner)
    
    Proxy.newProxyInstance(classLoader,interaces,handler);
  37.     //dinnerProxy.eat("包子");
    
  38.     dinnerProxy.drink();
    
  39. }
    
  40. }
  41. interface Dinner{
  42. void eat(String foodName);
    
  43. void drink();
    
  44. }
  45. class Person implements Dinner{
  46. private String name;
    
  47. public Person(String name) {
    
  48.     this.name = name;
    
  49. }
    
  50. @Override
    
  51. public void eat(String foodName) {
    
  52.     System.out.println(name+"正在吃"+foodName);
    
  53. }
    
  54. @Override
    
  55. public void drink( ) {
    
  56.     System.out.println(name+"正在喝茶");
    
  57. }
    
  58. }
  59. class Student implements Dinner{
  60. private String name;
    
  61. public Student(String name) {
    
  62.     this.name = name;
    
  63. }
    
  64. @Override
    
  65. public void eat(String foodName) {
    
  66.     System.out.println(name+"正在食堂吃"+foodName);
    
  67. }
    
  68. @Override
    
  69. public void drink( ) {
    
  70.     System.out.println(name+"正在喝可乐");
    
  71. }
    
  72. }

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

总结

1在不修改原有代码的 或者没有办法修改原有代码的情况下  增强对象功能  使用代理对象 代替原来的对象去完成功能

进而达到拓展功能的目的

2JDK Proxy 动态代理面向接口的动态代理  一定要有接口和实现类的存在 代理对象增强的是实现类 在实现接口的方法重写的方法

生成的代理对象只能转换成 接口的不能转换成 被代理类

代理对象只能增强接口中定义的方法  实现类中其他和接口无关的方法是无法增强的

代理对象只能读取到接口中方法上的注解 不能读取到实现类方法上的注解


Generated with Mybase Desktop 8.2.13

标签:name,JDK,Spring,void,代理,println,public,String
From: https://www.cnblogs.com/01way/p/17591277.html

相关文章

  • 8_Spring_注解方式管理bean
    8_Spring_注解方式管理bean1注解方式创建对象IOC导入依赖aop@Component  放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中该注解有三个子注解@Controller 用于实例化controller层bean@Service    用于实例化service层bean@Repositor......
  • 7_Spring_使用外部属性配置文件
    7_Spring_使用外部属性配置文件spring容器可以读取.properties属性配置文件,可以将文件中的信息注入给bean例如,引入Druid数据源,配置连接池信息1 导入Druid依赖和mysql-connector依赖<dependency><groupId>com.alibaba</groupId><artifa......
  • 13_Spring_AOPXML方式实现_了解
    13_Spring_AOPXML方式实现_了解1、创建两个类,增强类和被增强类,创建方法见之前的代码2、在spring配置文件中创建两个类对象 3、在spring配置文件中配置切入点<aop:config><!--切入点--><aop:pointcutid="pointCutAdd"expression="execution......
  • 12_Spring_AOP注解方式实现_掌握
    12_Spring_AOP注解方式实现_掌握AspectJ本身并不是spring框架中的组成部分,是一个独立的AOP框架,一般把AspectJ和Spring框架的AOP依赖一起使用,所以要导入一个独立的依赖实现的两种方式1基于注解方式实现(熟练)2基于XML配置方式(了解)准备工作1导入依赖<!-......
  • 11_Spring_AOP概念和原理
    11_Spring_AOP概念和原理AOP切面编程一般可以帮助我们在不修改现有代码的情况下,对程序的功能进行拓展,往往用于实现日志处理,权限控制,性能检测,事务控制等AOP实现的原理就是动态代理,在有接口的情况下,使用JDK动态代理,在没有接口的情况下使用cglib动态代理为Dao层所有的......
  • 10_Spring_CGLIB动态代理
    10_Spring_CGLIB动态代理proxy动态代理面向接口1必须有接口和实现类2增强接口中定义的方法3只能读取接口中方法的上注解cglib动态代理模式面向父类packagecom.msb.testCglib;importorg.junit.Test;importorg.springframework.cglib.proxy.Enhancer;importorg.s......
  • 14_Spring_JDBCTemplate的使用
    14_Spring_JDBCTemplate的使用JdbcTemplate概述JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的JdbcAPI对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等......
  • 1_Spring概念介绍_了解
    1_Spring概念介绍_了解Spring是分层的全栈式的轻量级开发框架,以IOC和AOP为核心,官网是https://spring.ioSpring版本情况Spring优势1方便解耦,简化开发Spring通过容器,将对象的创建从代码中剥离出来,交给Spring控制,避免直接编码造成模块之间的耦合度高,用户也不必自己编......
  • 【SpringBoot】快速入门
    (知识目录)一、SpringBoot快速入门1.1idea创建(1)新建模块,选择SpringInitializer,一定要记得选择SpringBoot的版本为2.7.7注意上面的两个目录一定要是空目录,然后点击apply,OK即可,之后进入到主界面。(2)编写UserController类packagecom.itxiaoguo.controller;importor......
  • Spring Security安全框架在Spring Boot框架中的使用
    SpringSecurity是一个基于Spring框架的安全框架,它提供了一系列的安全服务和功能,包括身份验证、授权、防护等。在SpringBoot框架中,SpringSecurity是一个非常重要的组件,它可以帮助我们实现应用程序的安全性。本文将详细介绍SpringSecurity在SpringBoot框架中的使用,包括如何配置S......