前言

本教程适合有一定数据库开发经验的人员阅读。对于刚开始接触数据库的童鞋,建议直接跳到本文的References中去选择更适合的教程。还有一点需要注意的是,mongodb的版本2和版本3之间存在很大差异,查看教程的时候一定要注意~

阅读全文 »

序言

最近在搭一个集群环境。为了能让Master节点和Slave节点之间能够快速通讯,所以需要配置Master节点向Slave节点的免密登录。网上的教程非常多,但是我按照正常流程走了一遍之后还是会出现问题。所以这里我试着将我配置时候遇到的问题以及相应的解决方案记录下来。

阅读全文 »

前言

本人从事JAVA编程已经有一些年月了(咳咳咳咳咳~喝一口茶),基本上在每次的项目开发过程中都会使用一些集成工具,比如说Maven或是Gradle。最近在写一个项目,但是项目在打包的过程中出现了问题,对把MAVEN一直当作傻瓜工具来使用的我完全不知道如何去解决这些问题。所以现在我想重新来了解一下这个工具,并用一种通俗易懂的方式来解释这个工具的用意。

阅读全文 »

什么是Union Find

Union Find是并查集的一种数据结构。 先理解两个对象之间“相连的关系”
对象p和对象q相连是指:

自反性:p和p相连
对称性:如果p和q相连,那么q和p也相连
传递性:如果p和q相连而且q和r相连,那么p和r相连

在并查集中,如果想要将连个对象相连,当且仅当这两个对象不在同一个连通分量中时,才会相连。这句话什么意思呢?也就是说,如果已经存在一条路径,使得p和q之间相通,那么就不会对后续的连接p和q的请求作出任何操作。

阅读全文 »

前言

在spring漫长的历史中,配置一直是新手入门的头疼问题。往往只能从网上找到一个demo,再将里面的内容修改为自己的数据。但是一旦出现新的需求,往往不知道如何修改配置。spring经历了从xmlproperties文件再到yml文件乃至利用java代码进行配置,努力将配置文件保持对用户友好。但是在这个可读性增强的过程中其实学习曲线也在一定程度的上升。

所以这篇文章的目的并不是教会你去配置spring项目,而是要教会你如何去读懂spring配置文件

阅读全文 »

写在SpEL之前

EL表达式是JSP中一个十分重要的概念。它允许我们从model中读取数据以及条件性的渲染JSP页面。Spring在3.0的版本中也引入了Spring Expression Language从而使得spring具有更好的可扩展性和跨平台性。
虽然SpEL引擎作为Spring 组合里的表达式解析的基础 ,但它不直接依赖于Spring,可独立使用。这也是SpEL的最大优点。

这一章内容将包括SpEL的使用,并且会举一个例子从配置文件中读取相应的属性。因为最终的项目是为了实现thymeleaf+springboot+mysql, 而很多地方都无形中使用了SpEL,比如Thymeleaf获取model数据,比如项目从config文件中获取常量配置。让我们赶紧来感受一下这个功能的强大吧。

阅读全文 »

Thymeleaf简介

配置Thymeleaf

这个教程是基于maven环境进行配置的。

1.在resources文件夹之下新加两个文件夹,分别为templates和static,其中templates用于存放界面HTML文件,而static则用于存储静态文件比如js,css或img。目录格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
-project
-src
-main
-java
-resources
-templates
-static
-config
-application.yml
-application-test.yml
-application-validate.yml
-test
-pom.xml

2.pom.xml文件中添加依赖:

1
2
3
4
 <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
阅读全文 »

软件设计原则

这篇文章主要讨论如何以健壮的方式应对变化的需求,从而保持良好的编程习惯。

前言

软件设计是开发周期中最重要的一个环节。在实现弹性和灵活的设计上花的时间越多,未来在面对需求变更时节约的时间就越多。

需求总是在变化–如果没有定期加入新功能,或是维护现有功能,软件很快就会成为遗弃产物–而这些变化带来的开销是由系统的架构和体系结构决定的。在这篇文章中,我们将会讨论一个关键的设计原则,该设计原则能帮助我们创建易于维护和扩展的软件。

阅读全文 »

前言

上一篇文章请参考猫头鹰的深夜翻译:核心JAVA并发(一)

安全发布

发布一个对象是指该对象的引用对当前的域之外也可见(比如,从getter方法中获取一个引用)。要确保一个对象被安全的发布(即在初始化完成之后发布),可能需要使用同步。可以通过以下方法实现安全的发布:

  • 静态初始化方法。只有一个线程能够初始化静态变量因为该类的初始化是在一个排它锁之下完成的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class StaticInitializer {
    // Publishing an immutable object without additional initialization
    public static final Year year = Year.of(2017);
    public static final Set<String> keywords;
    // Using static initializer to construct a complex object
    static {
    // Creating mutable set
    Set<String> keywordsSet = new HashSet<>();
    // Initializing state
    keywordsSet.add("java");
    keywordsSet.add("concurrency");
    // Making set unmodifiable
    keywords = Collections.unmodifiableSet(keywordsSet);
    }
    }
  • volatile关键字。读者线程总是能获取最近的值,因为写线程总是在后续的读取之前进行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Volatile {
    private volatile String state;
    void setState(String state) {
    this.state = state;
    }
    String getState() {
    return state;
    }
    }
  • Atomics。比如,AtomicInteger将一个值存储为volatile类型,所以这里和volatile变量的规则相同

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Atomics {
    private final AtomicInteger state = new AtomicInteger();
    void initializeState(int state) {
    this.state.compareAndSet(0, state);
    }
    int getState() {
    return state.get();
    }
    }
  • Final类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Final {
    private final String state;
    Final(String state) {
    this.state = state;
    }
    String getState() {
    return state;
    }
    }
阅读全文 »
0%