详细了解MVC+proxy


Posted in Java/Android onJuly 09, 2021
目录
  • 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?"保存成功":"保存失败");
    }
}

详细了解MVC+proxy

 

总结

本篇文章就到这里了,希望能够帮助到你,也希望您能够多多关注三水点靠木的更多内容!

Java/Android 相关文章推荐
springboot @ConfigurationProperties和@PropertySource的区别
Jun 11 Java/Android
Java如何实现树的同构?
Jun 22 Java/Android
springboot如何初始化执行sql语句
Jun 22 Java/Android
mybatis中注解与xml配置的对应关系和对比分析
Aug 04 Java/Android
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
Sep 25 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
详解Spring Security中的HttpBasic登录验证模式
Mar 17 Java/Android
关于Mybatis中SQL节点的深入解析
Mar 19 Java/Android
Spring Boot DevTools 全局配置学习指南
Mar 31 Java/Android
Android Studio实现简易进制转换计算器
May 20 Java/Android
Android开发手册Chip监听及ChipGroup监听
Jun 10 Java/Android
app场景下uniapp的扫码记录
Jul 23 Java/Android
Spring实现内置监听器
Jul 09 #Java/Android
新手初学Java网络编程
Jul 07 #Java/Android
Java 语言中Object 类和System 类详解
Jul 07 #Java/Android
新手初学Java List 接口
Jul 07 #Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 #Java/Android
Java实现聊天机器人完善版
JavaGUI模仿QQ聊天功能完整版
You might like
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
写一段简单的PHP建立文件夹代码
2015/01/06 PHP
jQuery UI-Draggable 参数集合
2010/01/10 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
浅析vue-router原理
2018/10/19 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
js中Function引用类型常见有用的方法和属性详解
2019/12/11 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
2016/09/19 Python
Python3.x对JSON的一些操作示例
2017/09/01 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
详解移动端HTML5页面端去掉input输入框的白色背景和边框(兼容Android和ios)
2016/12/15 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
REN Clean Skincare官网:英国本土有机护肤品牌
2019/02/23 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
学生会竞聘书范文
2014/03/31 职场文书
团日活动总结范文
2014/04/25 职场文书
酒店管理专业毕业生求职自荐信
2014/04/28 职场文书
环保公益策划方案
2014/08/15 职场文书
小学生纪念九一八事变演讲稿
2014/09/14 职场文书
酒店财务总监岗位职责
2015/04/03 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang