详细了解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中一些比较常用的注解总结
Jun 11 Java/Android
Springboot如何使用logback实现多环境配置?
Jun 16 Java/Android
Java并发编程之Executor接口的使用
Jun 21 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
详解Java分布式事务的 6 种解决方案
Jun 26 Java/Android
Spring Boot 整合 Apache Dubbo的示例代码
Jul 04 Java/Android
SSM项目使用拦截器实现登录验证功能
Jan 22 Java/Android
Java字符串逆序方法详情
Mar 21 Java/Android
MyBatis配置文件解析与MyBatis实例演示
Apr 07 Java/Android
Java 超详细讲解hashCode方法
Apr 07 Java/Android
Spring Cloud Netflix 套件中的负载均衡组件 Ribbon
Apr 13 Java/Android
Android开发之底部导航栏的快速实现
Apr 28 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP编程网上资源导航
2006/10/09 PHP
PHP中路径问题的解决方案
2006/10/09 PHP
PHP网站基础优化方法小结
2008/09/29 PHP
PHP url 加密解密函数代码
2011/08/26 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
JQUERY复选框CHECKBOX全选,取消全选
2008/08/30 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
2011/05/12 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
javascript分页代码实例分享(js分页)
2013/12/13 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
JavaScript生成随机字符串的方法
2015/03/19 Javascript
JQuery给网页更换皮肤的方法
2015/05/30 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
vue.js中父组件调用子组件的内部方法示例
2017/10/22 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
分析python服务器拒绝服务攻击代码
2014/01/16 Python
Python实现线程状态监测简单示例
2018/03/28 Python
python脚本调用iftop 统计业务应用流量的思路详解
2019/10/11 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
详细分析Python垃圾回收机制
2020/07/01 Python
大学生活自我评价
2014/04/09 职场文书
社区健康教育工作方案
2014/06/03 职场文书
幼师大班个人总结
2015/02/13 职场文书
乡镇科协工作总结2015
2015/05/19 职场文书
基于Python实现股票收益率分析
2022/04/02 Python
浅谈Python中对象是如何被调用的
2022/04/06 Python
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技