详细了解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 相关文章推荐
简单总结SpringMVC拦截器的使用方法
Jun 28 Java/Android
一篇文章带你复习java知识点
Jun 28 Java/Android
解决SpringBoot文件上传临时目录找不到的问题
Jul 01 Java/Android
Log4j.properties配置及其使用
Aug 02 Java/Android
Java 获取Word中所有的插入和删除修订的方法
Apr 06 Java/Android
springboot用户数据修改的详细实现
Apr 06 Java/Android
Java 深入探究讲解简单工厂模式
Apr 07 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
Springboot-cli 开发脚手架,权限认证,附demo演示
Apr 28 Java/Android
详解Android中的TimePickerView(时间选择器)的用法
Apr 30 Java/Android
一文了解Java动态代理的原理及实现
Jul 07 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
正则表达式语法
2006/10/09 Javascript
关于文本留言本的分页代码
2006/10/09 PHP
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
php设计模式 Observer(观察者模式)
2011/06/26 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
php实现的操作excel类详解
2016/01/15 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
使用struts2+Ajax+jquery验证用户名是否已被注册
2016/03/22 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
vue + element-ui的分页问题实现
2018/12/17 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
JavaScript实现随机点名器实例详解
2019/05/07 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
Python 正则表达式操作指南
2009/05/04 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
Python的requests网络编程包使用教程
2016/07/11 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
详解python异步编程之asyncio(百万并发)
2018/07/07 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
数学教研活动总结
2014/07/02 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
Spring Boot mybatis-config 和 log4j 输出sql 日志的方式
2021/07/26 Java/Android
CSS控制继承中的height能变为可继承吗
2022/06/10 HTML / CSS