详细了解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 相关文章推荐
分析Netty直接内存原理及应用
Jun 14 Java/Android
利用Java设置Word文本框中的文字旋转方向的实现方法
Jun 28 Java/Android
Mybatis-plus在项目中的简单应用
Jul 01 Java/Android
新手初学Java List 接口
Jul 07 Java/Android
Java生成读取条形码和二维码的简单示例
Jul 09 Java/Android
spring boot中nativeQuery的用法
Jul 26 Java/Android
SpringMVC 整合SSM框架详解
Aug 30 Java/Android
Netty分布式客户端接入流程初始化源码分析
Mar 25 Java/Android
零基础学java之循环语句的使用
Apr 10 Java/Android
JavaWeb Servlet开发注册页面实例
Apr 11 Java/Android
SpringBoot使用ip2region获取地理位置信息的方法
Jun 21 Java/Android
Spring Cloud OAuth2实现自定义token返回格式
Jun 25 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获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP中的替代语法简介
2014/08/22 PHP
PHP.vs.JAVA
2016/04/29 PHP
ThinkPHP删除栏目(实现批量删除栏目)
2017/06/21 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
python requests模拟登陆github的实现方法
2019/12/26 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
大学四年个人自我小结
2014/03/05 职场文书
班主任个人工作反思
2014/04/28 职场文书
青年教师师德演讲稿
2014/08/26 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
Python如何解决secure_filename对中文不支持问题
2021/07/16 Python
Java 获取Word中所有的插入和删除修订的方法
2022/04/06 Java/Android