MVC理论基础

MVC架构

MVC架构

三层架构

img
  • Model包括数据访问层业务层
  • View属于表示层
  • Controllert通常被视为表示层的一部分,但也可能包含一些轻量级的业务逻辑

三层架构中,最关键的是表示层

  • 它直接与用户交互,所有的请求都经过表示层解析,再告知业务层处理。
  • 所有页面的返回和数据的填充也靠表示层来完成。

SpringMVC就是一个优秀的表示层框架,将业务逻辑和表示逻辑解耦,更加精细地划分对应的职责,最后将View和Model进行渲染,得到最终的页面并返回给前端。

阅读全文 »

ACID原则

事务机制遵循ACID原则:

  • Atomicity 原子性:事务是一个原子操作,由一系列操作组成。事务的原子性确保所有操作要么完成,要么完全不起作用(完整性)
  • Consistency 一致性:事务执行前后,系统必须确保它所建模的业务处于一致的状态。例如转账,无论事务是否成功,转账者和收款人的总额应该不变。
  • Isolation 隔离性:并发操作相同的数据时,各事务之间相互独立。(但难免会存在冲突
  • Durability 持久性:一旦事务完成,它对数据的改变是持久的,即使数据库发生故障也不影响持久性。

只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障(A、I、D是手段,C是目的)

阅读全文 »

现象

发起HTTP请求调用,控制台报错:

org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation

​ at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:322) ~[spring-webmvc-6.1.10.jar:6.1.10]

阅读全文 »

任何接口,如果只包含一个抽象方法,它就是一个函数式接口。对于函数式接口,可以通过Lambda表达式来创建该接口的对象

Runnable就是一个函数式接口。

  1. 新建一个函数式接口,并在抽象方法上加上@Transactional的事务注解。
  2. 在实际业务逻辑中需要事务的地方,通过Lambda表达式创建该接口的对象(必须实现唯一的抽象方法)。
  3. 执行该接口对象的方法,即将方法内的逻辑以事务的形式去执行。

spring事务的依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
</dependency>
public class Test {
    public void testTransaction() {
        int a = 0;
        int b = 1;

        TransactionConsumer transactionConsumer = () -> {
            insertDataA(a);
            updateDataB(b);
        };
        transactionConsumer.doInTransaction();
    }

    private void updateDataB(int b) {
    }

    private void insertDataA(int a) {
    }
}

@FunctionalInterface
public interface TransactionConsumer {
    @Transactional
    void doInTransaction();
}

Lombok介绍

Lombok 项目其实就是一个 java 库,它可以自动插入到编辑器和构建工具中,增强 java 的性能。以后你 只需要一些简单的注解,就可以再也不用在类中反复去写 getter、equals 等方法,让代码变得简介,不用过多地去关注相应的方法。属性修改时,也简化了维护这些属性所生成的 get、set 方法。

使用方式:

  1. IDEA 下载 Lombok 插件

  2. 项目中导入 Lombok 的 jar 包

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.26</version>
</dependency>
  1. 实体类 上使用 Lombok 注解
阅读全文 »

“::” 的含义

在 Java 中,双冒号 “::” 是 方法引用的语法。方法引用是一种 简化 Lambda 表达式的语法结构,使代码更加简洁易读。并且在使用方法引用时,会根据上下文推断参数类型,因此 特别适用于直接引用已有方法的情况


“::” 的用法

方法引用的一般形式:

ClassName::methodName

其中,ClassName 是包含方法 methodName 的类名。

Optional 被设计出来,主要是为了解决空指针异常

以一个 Student 类为例:

@Getter
class Student {
    private String name;
    private int age;
    private int score;

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public Student() {
    }
}
阅读全文 »

基础理论

CAP理论和BASE理论

一致性的三种级别

  • 强一致性

    系统写入了什么,读出来就是什么。

  • 弱一致性

    不一定可以读取到最新写入的值,也不保证多少时间之后能读取到最新的,只尽量保证某个时刻达到数据一致的状态。

  • 最终一致性

    弱一致性的升级版。不一定可以读取到最新写入的值,但保证在一定时间内达到数据一致的状态。

业界比较推崇最终一致性,但是某些对数据一致要求非常严格的场景,比如银行转账,还是要保证强一致性。

阅读全文 »

PriorityQueue的使用场景

Queue<Integer> queue1 = new PriorityQueue<>();

Queue<Integer> queue2 = new PriorityQueue<>(Comparator.comparingInt(o -> o));

Queue<Integer> queue3 = new PriorityQueue<>(Comparator.comparingInt(o -> -o));

Java中的PriorityQueue常用于实现小顶堆、大顶堆。由上述代码可见,通常有默认无参构造函数、传入Comparator对象等方式的实现。


困惑

从构造函数层面,完全不清楚默认构造函数的排序规则,也完全不明白Comparator实现的comparingInt方法对应的排序规则

根据网上绝大多数文章的描述,都没有解释或者只是说明了对应的排序规则,但是不知道为什么是对应升序或降序。通过阅读源码,才得到准确的认知。

阅读全文 »
0%