主页

三问Spring事务:解决什么问题?如何解决?存在什么问题?

1. 解决什么问题 让我们先从事务说起,“什么是事务?我们为什么需要事务?”。事务是一组无法被分割的操作,要么所有操作全部成功,要么全部失败。我们在开发中需要通过事务将一些操作组成一个单元,来保证程序逻辑上的正确性,例如全部插入成功,或者回滚,一条都不插入。作为程序员的我们,对于事务管理,所需要做的便是进行事务的界定,即通过类似begin transaction和end transaction的操作来界定事务的开始和结束。 下面是一个基本的JDBC事务管理代码: // 开启数据库连接 Connection con = openConnection(); try { // 关闭自动提交 con.setAutoCommit(false); // 业务处理 ...

阅读更多

系统学习Stream

Java8中最大的两个亮点,一个是Lambda表达式,另一个就是Stream。新特性的加入,一定是为了某种需求,那么Stream是什么,它能帮助我们做什么?首先看下面这个例子: 有这样一份数据,一组考卷List,每个Paper有三个属性分别是学生名字studentName、课程名称className和分数score。现在我们需要从中找出语文不及格(分数低于60)的学生名字,并且按分数从高到低排序。在不使用Java8新特性之前,相信大部分人都是像下面这样写的: public static List<String> getFailedPaperStudentNamesByJava7(List<Paper> papers) { // 筛选出不及格的考卷 ...

阅读更多

系统学习lambda表达式

在《挑苹果中的行为参数化思想》已经介绍了用Lambda表达式将行为抽象化,对Lambda表达式有一定认识。而本文将对Lambda表达式进行系统性的介绍。 1. 语法 首先我们要知道如何写Lambda表达式,或者说怎么样才能写出有效的Lambda表达式,这就需要了解其语法。 Lambda表达式由三部分组成: 参数列表 箭头 主体 有两种风格,分别是: 表达式-风格 (parameters) -> expression 块-风格 (parameters) -> { statements; } 依据上面的风格介绍,来试着判断下面给出示例是否有效: () -> {} ...

阅读更多

挑苹果中的行为参数化思想

草捏对Lambda表达式的了解停留在用IDEA自动替换匿名类的程度,以为Lambda表达式只是把代码缩短了而已,不过就是一个语法糖。所以一直不屑一顾,没系统学习。“不过就是代码短一点嘛,没啥大不了”。但通过学习才知道Lambda表达式不仅仅是把代码换了种表达方式,可能更重要的是背后的思想——行为参数化。 所谓的行为参数化,指的是我们可以通过参数传递的形式去指定代码的行为。是不是很眼熟,学过设计模式的童鞋,基本都是从策略模式开始学起的。策略模式便是面向接口编程,通过使用不同的实现类,改变具体的行为。行为参数化和策略模式的效果类似,只是多了个参数化,通过传递参数指定了具体的形式。 下面草捏给大家讲个关于挑苹果的小故事。 梅梅开始计划每天吃一个苹果,于是吩咐草捏去超市采购。草捏(一个没...

阅读更多

Spring源码—AOP概念的实现

Spring 作为 Java 中最流行的框架,主要归功于其提供的 IOC 和 AOP 功能。本文将讨论 Spring AOP 的实现。第一节将介绍 AOP 的相关概念,若熟悉可跳过,第二节中结合源码介绍 Spring 是如何实现 AOP 的各概念。 1. AOP 概念 1.1 JoinPoint 进行织入操作的程序执行点。 常见类型: 方法调用(Method Call):某个方法被调用的时点。 方法调用执行(Method Call Execution):某个方法内部开始执行的时点。 方法调用是在调用对象上的执行点,方法调用执行是在被调用对象的方法开始执行点。 构造方法调用(Constru...

阅读更多

Spring源码-循环依赖(附25张调试截图)

Spring 在哪些情况下会出现循环依赖错误?哪些情况下能自身解决循环依赖,又是如何解决的?本文将介绍笔者通过本地调试 Spring 源码来观察循环依赖的过程。 1. 注解属性注入 首先本地准备好一份 Spring 源码,笔者是从 Github 上 Clone 下来的一份,然后用 IDEA 导入,再创建一个 module 用于存放调试的代码。 本次调试有三个类,A、B 通过注解 @Autowired 标注在属性上构成循环依赖,Main 为主函数类。 @Component("A") public class A { @Autowired B b; } @Component("B") public class B { @Autowired A a; } publ...

阅读更多

ZAB协议和一些思考

在《ZooKeeper的作用、应用场景和替代品》中已对 ZooKeeper 进行了介绍,知道了 ZooKeeper 是通过 主从模式 + ZAB 协议 解决单点问题,其中 ZAB 协议是保证分布式一致性的关键。本文将进一步讨论 ZAB 协议和一些问题的思考。 ZAB 协议 ZAB(ZooKeeper Atomic Broadcast,ZooKeeper 原子消息广播协议),其作用在于保证主从节点的一致性。那首先看下 ZooKeeper 的架构图: 从图中我们可以看出在多个 Server 中,只有一台是 Leader,而其他 Server 则担任的角色为 Follower 或 Observer。为了叙述方便,本文我们只讨论 Leader 和 Follower 这两种角色的情况。...

阅读更多

REST服务,使用Dubbo还是SpringMVC?

SpringMVC、Dubbo 都支持 REST 服务,那当我们要开发一个 REST 服务接口时,该如何选择? 本文将包括以下两方面内容: REST服务的写法 REST服务的应用场景 1. REST服务的写法 首先我们看下 SpringMVC 怎么实现一个 REST 服务: @RestController @RequestMapping("/greetings") public class SpringRestController { @RequestMapping(method = RequestMethod.GET, value = "/{name}", produces...

阅读更多