详细了解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 相关文章推荐
JPA如何使用entityManager执行SQL并指定返回类型
Jun 15 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
新手初学Java网络编程
Jul 07 Java/Android
OpenCV实现普通阈值
Nov 17 Java/Android
Java实现学生管理系统(IO版)
Feb 24 Java/Android
Netty客户端接入流程NioSocketChannel创建解析
Mar 25 Java/Android
Flutter集成高德地图并添加自定义Maker的实践
Apr 07 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
Android基础入门之dataBinding的简单使用教程
Jun 21 Java/Android
Java实现字符串转为驼峰格式的方法详解
Jul 07 Java/Android
Java Redisson多策略注解限流
Sep 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
一个数据采集类
2007/02/14 PHP
一个自定义位数的php多用户计数器代码
2007/03/11 PHP
php 操作符与控制结构
2012/03/07 PHP
php笔记之:AOP的应用
2013/04/24 PHP
浅析php单例模式
2014/11/25 PHP
PHP多线程编程之管道通信实例分析
2015/03/07 PHP
PHP+jQuery+Ajax实现用户登录与退出
2015/04/27 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
PHP递归删除多维数组中的某个值
2017/04/17 PHP
PHP解决中文乱码
2017/04/28 PHP
Extjs学习笔记之五 一个小细节renderTo和applyTo的区别
2010/01/07 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
使用jquery修改表单的提交地址基本思路
2014/06/04 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
vue-loader教程介绍
2017/06/14 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Python模拟百度自动输入搜索功能的实例
2019/02/14 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
在django admin中配置搜索域是一个外键时的处理方法
2020/05/20 Python
英国领先的新鲜松露和最好的松露产品供应商:TruffleHunter
2019/08/26 全球购物
护士长竞聘书
2014/03/31 职场文书
小学生读书活动总结
2014/06/30 职场文书
老公保证书怎么写
2015/02/26 职场文书
煤矿安全保证书
2015/02/27 职场文书
高一语文教学反思
2016/02/16 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis