首页 > 其他分享 >Spring Study -lesson11-动态代理(反射机制)-2023-03-18

Spring Study -lesson11-动态代理(反射机制)-2023-03-18

时间:2023-03-18 17:12:59浏览次数:40  
标签:03 Spring Study Object 代理 public import com void

第一:接口类(增删改查)

package com.feijian.Service;

public interface UserService {
    public void addUser();
    public void updateUser();
    public void deleteUser();
    public void insertUser();
}

第二:接口实现类(implements)

package com.feijian.Service;

public class UserServiceImpl implements UserService{
    @Override
    public void addUser() {
        System.out.println("增加了一个用户");
    }

    @Override
    public void updateUser() {
        System.out.println("更新了一个用户");
    }

    @Override
    public void deleteUser() {
        System.out.println("删除了一个用户");
    }

    @Override
    public void insertUser() {
        System.out.println("插入了一个用户");
    }
}

第三:自动生成代理类 (变为一个工具类) 1、代理谁    2、生成得到代理类    3、调用代理的执行方法

package com.feijian.Demo02;

import com.feijian.Demo.Rent;
import com.sun.corba.se.impl.ior.OldJIDLObjectKeyTemplate;

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

//用这个类自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {

    //1、代理谁? 被代理的接口
    private Object target;
    public void setTarget(Object target) {
        this.target = target;
    }

    //2、生成得到代理类
    public Object getProxy(){
      return  Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this );
    }

    @Override
    //3、处理代理实例,调用代理的执行方法
    //动态代理的本质就是用反射机制
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }

    public void log(String msg){
        System.out.println("执行了"+msg+"方法");
    }
}

第四:测试

package com.feijian.Demo02;

import com.feijian.Service.UserService;
import com.feijian.Service.UserServiceImpl;

import java.lang.reflect.InvocationHandler;

public class Client {
    public static void main(String[] args) {
        //1、真实角色
        UserServiceImpl userService = new UserServiceImpl();
        //2、代理角色,不存在
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //3、设置要代理的对象  (set方法)
        pih.setTarget(userService);
        //4、动态生成代理类
        UserService proxy = (UserService) pih.getProxy();
        //5、代理执行不同的方法
        proxy.insertUser();


    }
}

标签:03,Spring,Study,Object,代理,public,import,com,void
From: https://www.cnblogs.com/RUI2022/p/17231216.html

相关文章

  • java.sql.SQLSyntaxErrorException: Table 'test.user' doesn't exist报错问题解决
    以下内容仅供自己学习使用,侵权必删在使用mubatis-plus的时候报错了以下内容java.sql.SQLSyntaxErrorException:Table'test.user'doesn'texist解决方法:2.1在......
  • 玩转SpringBoot原理:掌握核心技术,成为高级开发者
    本文通过编写一个自定义starter来学习springboot的底层原理,帮助我们更好的使用springboot集成第三方插件步骤一:创建项目步骤二:添加依赖步骤三:创建自动配置类步骤四:创......
  • 20230318总结
    以后每周六总结一下一周吧这周感觉是终于摆烂的时候比较少了,现在莫名其妙的给自己找了很多方向来卷,然后觉得自己卷的效率并不高。感觉自己还是要强行让自己跳脱出自己的......
  • day03
    day03Java的控制流程结构与C和C++的控制流程结构一样,只有很少的例外情况。没有goto语句,但break语句可以带标签,可以利用它实现从内层循环跳出的目的(这种情况C语言采用goto......
  • 20230317软件测试入门
    https://zh.wikipedia.org/wiki/软件测试https://www.ibm.com/cn-zh/topics/software-testinghttps://www.softwaretestingmaterial.com/software-testing/https......
  • 一个基于微服务架构的SpringBoot+vue2.0的在线教育系统【源码开源】【强烈建议收藏】
    今天给大家开源一个基于springboot+vue2.0的微服务在线教育平台系统,系统是攀登网的孟哥和汉远哥开发的,我进行了本版本的开发。该系统完全免费、开源。为防止刷着刷者找不......
  • REST风格下的SpringMVC简单响应方法
    学习中,如有错误请见谅  项目结构   ServletContainersInitConfigpublicclassServletContainersInitConfigextendsAbstractAnnotationConfigDispatcher......
  • MySQL 2023-03-18
    MySQLpractice1.createadatabasewithnameexample,andsetthecharactersettoutf82.altertheexampledatabase,andsetthecharactersettogbk3.dropthe......
  • Springboot 核心注解的作用
    SpringBoot是一个非常流行的Java开发框架,它采用注解的方式来简化应用程序的开发和配置。在SpringBoot中,核心注解是一组用于控制和配置应用程序的注解。本文将介绍这......
  • 2023-03-18
    1.C++面向对象开发当前主要还是偏向去用面向过程的思路来解决问题,一个是不能很好的设计类,一个是不知道怎么高效的去用代码实现类间通信,以及安全性完全没有考虑。......