MENU

Keep It Stupid Simple

Spring Boot 之 Hello World

Spring boot 简化了基于 Spring 的应用开发,它为 Spring 以及第三方库提供了开箱即用的设置,减少了复杂配置;提供了内嵌服务器、健康监测等特性;我们可以使用java -jar来启动一个web应用。

本文将完成一个最简单的基于 spring boot 的 web 项目,通过这个项目来熟悉 spring boot 的项目结构;首先,需要安装jdk 1.7+、构建工具mavengradleintellij idea

$ java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
$ mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: C:\Program Files\apache-maven-3.3.9
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_121\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"

创建项目

创建一个maven项目,编辑pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>tech.sheli.xjc</groupId>
    <artifactId>xjc-web-hello</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!-- 继承自Spring Boot的默认parent -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
    </parent>

    <dependencies>
        <!-- 添加Web应用程序的典型依赖项 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <!-- 包作为可执行jar -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

以上就是个典型的pom.xml文件,继承了spring-boot-starter-parent,它包含了java版本(1.6)、项目编码(UTF-8)、测试框架、spring-boot-maven-plugin等,当然也可以不使用spring-boot-starter-parent,自己配置,具体配置会有单独的文章说明;设置spring-boot-starter-web依赖,也是唯一显示配置的依赖。

Read More

Spring Boot配置log4j

一般来情况下,无需切换日志实现;logback能很好地满足需求。如果必须切换到log4j,那么你只需要排除掉logback依赖,引入log4j的starter依赖。

排除spring-boot-starter

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

增加log4j的starter依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

配置log4j.properties

log4j.rootLogger=INFO,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS} %p [%c] %m%n

以上为示例配置,请根据实际情况修改。

配置完毕,启动项目;此时控制台会输出INFO及以上级别的日志。

Read More

Java并发基础

Synchronized

synchronized关键字是用来控制线程同步的;可以加在代码块上,也可以加在方法上。

不使用synchronized

public class SynchronizedDemo {
    private int count = 10;
    public void m() {
        count--;
        System.out.println(Thread.currentThread().getName() + "->" + count);
    }

    public static void main(String[] args) {
        SynchronizedDemo sync = new SynchronizedDemo();
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(sync::m, "thread" + i);
            thread.start();
        }
    }
}

执行结果:

thread0->8
thread2->7
thread1->8
thread3->6
thread4->5
thread5->4
thread6->3
thread7->2
thread8->1
thread9->0

synchronized语法

任何线程要执行代码块的代码,必须先拿到obj的锁:

public class SynchronizedDemo {
    private int count = 10;
    private final Object obj = new Object();

    public void m() {
        synchronized (obj) {
            count--;
            System.out.println(count);
        }
    }
}

Read More