详细了解MVC+proxy

目录
  • 1、创建业务层UserService接口定义需要完成的功能
  • 2、创建持久层UserDao接口定义具体的CURD
  • 3、完成UserService接口和UserDao的实现类
  • 4、创建InvocationHandler接口的实现类
  • 5、创建表示层Servlet去完成调用
  • 总结

1、创建业务层UserService接口定义需要完成的功能

/**
 * 创建目标接口,定义目标接口要完成的功能
 */
public interface UserService {
    boolean save(User user);
}

2、创建持久层UserDao接口定义具体的CURD

/**
 * 创建目标接口,定义目标接口要完成的功能
 */
public interface UserService {
    boolean save(User user);
}

3、完成UserService接口和UserDao的实现类

public class UserServiceImpl implements UserService {
    private UserDao dao=new UserDaoImpl();
    @Override
    public boolean save(User user) {
        boolean success=false;
        success=dao.insert(user);
        return success;
    }
}

这里省略具体的JDBC代码

public class UserDaoImpl implements UserDao {
    @Override
    public boolean insert(User user) {
        System.out.println("insert into t_user (username,password)values('"+user.getUsername()+"','"+user.getPassword()+"')");
        return true;
    }
}

4、创建InvocationHandler接口的实现类

为什么需要这个接口?

因为在开发中,业务层可能含有涉及到多步数据库操作,所以这一步需要开启事务,但是开发中这样的情况太多了,所以我们需要面向横切面编程,创建代理代理,在调用业务层方法时,我们利用jdk动态代理的增强功能提供事务。这样,事务代码只用写一次,但是每次业务层方法调用时,我们都可以使用代理对象去调用业务层方法来开启事务。实现了代码复用。

public class UserHandler implements InvocationHandler {

    //动态创建目标对象
    Object target=null;
    public UserHandler(Object target){
        this.target=target;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //返回值
        Object result=null;
        //增强功能
        System.out.println("begin Transaction.....");
        result=result=method.invoke(target,args);
        System.out.println("commit Transaction.....");
        System.out.println("rollback Transaction.....");
        System.out.println("end Transaction.....");
        //返回值
        return result;
    }
}

这里我就用输出语句代表事务语句。

5、创建表示层Servlet去完成调用

public class UserSaveServlet {
    public static void main(String[] args) throws Exception {
        //需要调用的目标类
        Class c= UserServiceImpl.class;
        Object obj = c.newInstance();
        //获取该类的类加载器
        ClassLoader loader = obj.getClass().getClassLoader();
        //目标对象实现的接口
        Class<?>[] interfaces=obj.getClass().getInterfaces();
        //获取InvocationHandler对象
        InvocationHandler handler=new UserHandler(obj);
        //创建代理对象
        //将返回值转为接口类型
        UserService service=(UserService)Proxy.newProxyInstance(loader,interfaces,handler);
        boolean success=service.save(new User("张三","123456"));
        System.out.println(success?"保存成功":"保存失败");
    }
}

总结

本篇文章就到这里了,希望能够帮助到你,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 详解Java Proxy动态代理机制

    一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.class类型文件,类加载器负责读取字节代码,并转换成java.lang.Class对象,描述类在元数据空间的数据结构,类被实例化时,堆中存储实例化的对象信息,并且通过对象类型数据的指针找到类. 过程描述:源码->.java文件->.class文件->Class对象->实例对象 所以通过

  • js Proxy的原理详解

    什么是代理模式 引入一个现实生活中的案例 我们作为用户需要去如何评估一个房子的好坏.如何办理住房手续等一些列繁琐的事物吗?显然,用户肯定不愿意这样做.用户最关心的是结果,用户对房子提出需求以及提供对等价值的金钱就可以获得满意的房子,这就是结果. 那么谁为用户去解决一系列繁琐的买房过程呢?当然就是"房屋中介"了!房屋中介的作用就是在房地产开发经营与消费的供求市场中,为交易物体提供评估.交易.代理.咨询等服务及善后服务的机构. 结合案例理解代理模式的定义 在某些情况下,一个对象不适合或者不

  • 详解Java的Proxy动态代理机制

    一.Jvm加载对象 在说Java动态代理之前,还是要说一下Jvm加载对象的过程,这个依旧是理解动态代理的基础性原理: Java类即源代码程序.java类型文件,经过编译器编译之后就被转换成字节代码.class类型文件,类加载器负责读取字节代码,并转换成java.lang.Class对象,描述类在元数据空间的数据结构,类被实例化时,堆中存储实例化的对象信息,并且通过对象类型数据的指针找到类. 过程描述:源码->.java文件->.class文件->Class对象->实例对象 所以通过

  • 详解MySQL事务的隔离级别与MVCC

    事务隔离级别 事务并发执行遇到的问题 脏写 如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写 脏读 如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发生了脏读 不可重复读 如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询到最新值,那就意味着发生了不可重复读 幻读 如果一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的

  • SpringMVC框架整合Junit进行单元测试(案例详解)

    本文主要介绍在SpringMVC框架整合Junit框架进行单元测试.闲话少述,让我们直入主题. 系统环境 软件 版本 spring-webmvc 4.3.6.RELEASE spring-test 4.3.6.RELEASE junit 4.12 引入依赖 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</ver

  • 详细了解MVC+proxy

    目录 1.创建业务层UserService接口定义需要完成的功能 2.创建持久层UserDao接口定义具体的CURD 3.完成UserService接口和UserDao的实现类 4.创建InvocationHandler接口的实现类 5.创建表示层Servlet去完成调用 总结 1.创建业务层UserService接口定义需要完成的功能 /** * 创建目标接口,定义目标接口要完成的功能 */ public interface UserService { boolean save(User us

  • 基于asp.net MVC 应用程序的生命周期(详解)

    首先我们知道http是一种无状态的请求,他的生命周期就是从客户端浏览器发出请求开始,到得到响应结束.那么MVC应用程序从发出请求到获得响应,都做了些什么呢? 本文我们会详细讨论MVC应用程序一个请求的生命周期,从一个控件到另一个控件是怎样被处理的.我们还会详细介绍一下整个请求的生命周期中,用到的相关组件.因为在平常的开发过程中,我们可能知道怎样去使用MVC框架来处理相关的请求,大部分的时候我们只是在controller和action方法之间做相关的处理,对于真正内在的运行机制可能不是很了解.其实

  • 一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)详细教程

    前言 SSM(Spring+SpringMVC+Mybatis)是目前较为主流的企业级架构方案,不知道大家有没有留意,在我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配合注解的方式,编程非常快捷,而且通过restful风格定义url,让地址看起来非常优雅. 另外,MyBatis也可以替换Hibernate,正因为MyBatis的半自动特点,我们程

  • Java Proxy机制详细解读

    动态代理其实就是java.lang.reflect.Proxy类动态的根据您指定的所有接口生成一个class byte,该class会继承Proxy类,并实现所有你指定的接口(您在参数中传入的接口数组):然后再利用您指定的classloader将 class byte加载进系统,最后生成这样一个类的对象,并初始化该对象的一些值,如invocationHandler,以即所有的接口对应的Method成员. 初始化之后将对象返回给调用的客户端.这样客户端拿到的就是一个实现你所有的接口的Proxy对象

  • Android设计模式之代理模式Proxy浅显易懂的详细说明

    一.概述 代理模式也是平时比较常用的设计模式之一,代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.在日常生活中也是很常见的.例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用.平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这里也是使用了代理模式. 代理模式的组成 Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

  • 教你使用idea搭建ssm详细教程(Spring+Spring Mvc+Mybatis)

    一.创建maven项目 我使用的是汉化的idea 可以选择原型,我这里没有选择 输入项目名称,完成创建 二.配置tomcat 选择运行编辑配置 点加号找见tomcat,点击确定 三.添加web模块 点击文件进入项目结构,选择模块 点加号找见web,点击确定 四.添加工件 点击加号添加,并将可用元素中的jar包,右击,加入lib中 五.为项目添加tomcat的jar包 选择模块,选择项目名 选择web服务 六.idea不会编译src下的mapper.xml文件 让idea编译器不忽略src下的ma

  • Java 超详细讲解Spring MVC异常处理机制

    目录 异常处理机制流程图 异常处理的两种方式 简单异常处理器SimpleMappingExceptionResolver 自定义异常处理步骤 本章小结 异常处理机制流程图 系统中异常包括两类: 预期异常 通过捕获异常从而获取异常信息. 运行时异常RuntimeException 主要通过规范代码开发.测试等手段减少运行时异常的发生. 系统的Dao.Service.Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如

  • JavaScript Object.defineProperty与proxy代理模式的使用详细分析

    目录 1. Object.defineProperty 2. Object.defineProperties 3. proxy 代理模式 总结 1. Object.defineProperty const obj = {}; Object.defineProperty(obj,prop,descript); 参数 obj 要定义属性的对象 prop 要定义的属性 descript 属性描述符 返回值:被传递给函数的对象 descript接收一个对象作为配置: writable 属性是否可写 默认

  • 详细探究ES6之Proxy代理

    前言 在ES6中,Proxy构造器是一种可访问的全局对象,使用它你可以在对象与各种操作对象的行为之间收集有关请求操作的各种信息,并返回任何你想做的.ES6中的箭头函数.数组解构.rest 参数等特性一经实现就广为流传,但类似 Proxy 这样的特性却很少见到有开发者在使用,一方面在于浏览器的兼容性,另一方面也在于要想发挥这些特性的优势需要开发者深入地理解其使用场景.就我个人而言是非常喜欢 ES6 的 Proxy,因为它让我们以简洁易懂的方式控制了外部对对象的访问.在下文中,首先我会介绍 Prox

  • Spring MVC 与 CORS跨域的详细介绍

    1. CORS 简介 同源策略(same origin policy)是浏览器安全的基石.在同源策略的限制下,非同源的网站之间不能发送 ajax 请求的. 为了解决这个问题,w3c 提出了跨源资源共享,即 CORS(Cross-Origin Resource Sharing). CORS 做到了两点: 不破坏即有规则 服务器实现了 CORS 接口,就可以跨源通信 基于这两点,CORS 将请求分为两类:简单请求和非简单请求. 1.1 简单请求 可以先看下 CORS 出现前的情况:跨源时能够通过 s

随机推荐