详细了解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如何使用logback实现多环境配置?
Jun 16 Java/Android
Java新手教程之ArrayList的基本使用
Jun 20 Java/Android
springcloud之Feign超时问题的解决
Jun 24 Java/Android
Java使用httpRequest+Jsoup爬取红蓝球号码
Jul 02 Java/Android
看完这篇文章获得一些java if优化技巧
Jul 15 Java/Android
dubbo服务整合zipkin详解
Jul 26 Java/Android
Java实现给Word文件添加文字水印
Feb 15 Java/Android
关于Mybatis中SQL节点的深入解析
Mar 19 Java/Android
SpringBoot整合Minio文件存储
Apr 03 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
Java对文件的读写操作方法
Apr 29 Java/Android
volatile保证可见性及重排序方法
Aug 05 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
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
php使用base64加密解密图片示例分享
2014/01/20 PHP
PHP中each与list用法分析
2016/01/08 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
js数组操作常用方法
2014/05/08 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
AngularJS内建服务$location及其功能详解
2016/07/01 Javascript
JavaScript性能优化总结之加载与执行
2016/08/11 Javascript
微信小程序 swiper组件轮播图详解及实例
2016/11/16 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
解决 viewer.js 动态更新图片导致无法预览的问题
2019/05/14 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
Python的函数嵌套的使用方法
2014/01/24 Python
web.py获取上传文件名的正确方法
2014/08/26 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
python 图像平移和旋转的实例
2019/01/10 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
NULL是什么,它是怎么定义的
2015/05/09 面试题
小学数学课后反思
2014/04/23 职场文书
Python的代理类实现,控制访问和修改属性的权限你都了解吗
2022/03/21 Python
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle