详细了解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 相关文章推荐
Java新手教程之ArrayList的基本使用
Jun 20 Java/Android
启动Tomcat时出现大量乱码的解决方法
Jun 21 Java/Android
Java实现二维数组和稀疏数组之间的转换
Jun 27 Java/Android
Java使用JMeter进行高并发测试
Nov 23 Java/Android
Java并发编程之原子性-Atomic的使用
Mar 16 Java/Android
你知道Java Spring的两种事务吗
Mar 16 Java/Android
SpringBoot中使用Redis作为全局锁示例过程
Mar 24 Java/Android
Spring Boot项目传参校验的最佳实践指南
Apr 05 Java/Android
Elasticsearch Recovery 详细介绍
Apr 19 Java/Android
向Spring IOC 容器动态注册bean实现方式
Jul 15 Java/Android
Mybatis 一级缓存和二级缓存原理区别
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
PHP 向右侧拉菜单实现代码,测试使用中
2009/11/03 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
2014/07/28 PHP
帝国cms常用标签汇总
2015/07/06 PHP
php验证码生成器
2017/05/24 PHP
DOM下的节点属性和操作小结
2009/05/14 Javascript
JavaScript中继承的一些示例方法与属性参考
2010/08/07 Javascript
情人节之礼 js项链效果
2012/02/13 Javascript
innerHTML属性,outerHTML属性,textContent属性,innerText属性区别详解
2015/03/13 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
2017/07/07 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
Webpack中publicPath路径问题详解
2018/05/03 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
2018/08/31 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
js实现导航跟随效果
2018/11/17 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
react中Suspense的使用详解
2019/09/01 Javascript
node.js +mongdb实现登录功能
2020/06/18 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
解决pyqt中ui编译成窗体.py中文乱码的问题
2016/12/23 Python
Python 操作MySQL详解及实例
2017/04/30 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python给图像加上mask,并提取mask区域实例
2020/01/19 Python
html5 canvas手势解锁源码分享
2020/01/07 HTML / CSS
美国时尚大码女装购物网站:Avenue
2019/05/24 全球购物
美国踏板车和轻便摩托车销售网站:Mega Motor Madness
2020/02/26 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
计算机专业毕业生推荐信
2013/11/25 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
中秋节寄语2015
2015/03/24 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
python装饰器代码解析
2022/03/23 Python
基于docker安装zabbix的详细教程
2022/06/05 Servers
MySQL深分页问题解决思路
2022/12/24 MySQL