Java教程

基础

线程与进程

开个QQ,开了一个进程;开了迅雷,开了一个进程。在QQ的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成QQ的运行,那么这“多个工作”分别有一个线程。所以一个进程管着多个线程。通俗的讲:“进程是爹妈,管着众多的线程儿子”...

Spring Boot快速入门

简介

简介

简化Spring应用开发的一个框架;

整个Spring技术栈的一个大整合;

J2EE开发的一站式解决方案;

  • 背景

J2EE笨重的开发、繁多的配置、低下的开发效率、复杂的部署流程、第三方技术集成难度大。

  • 解决

Spring全家桶时代。

Spring Boot -> J2EE一站式解决方案。

Spring Cloud -> 分布式整体解决方案。

  • 优点

快速创建独立运行的Spring项目以及与主流框架集成。

使用嵌入式的Servlet容器,应用无需打成WAR包。

starters自动依赖与版本控制。

大量的自动配置,简化开发,也可修改默认值。

无需配置XML,无代码生产,开箱即用。

准生产环境的运行时应用监控。

与云计算的天然集成。

  • 缺点

入门简单精通难。

环境准备

  • 一、Maven设置

设置maven/conf/settings.xml配置文件的profiles标签

<profile>
    <id>jdk-1.8</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
    </activation>
    <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    </properties>
</profile>
  • 二、IDEA设置

第一个项目:HelloWorld

一、创建Maven项目

二、导入Spring Boot相关的依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

三、编写一个主程序:启用Spring Boot应用

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by apple on 2018/6/29.
 * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
 */

@SpringBootApplication
public class HelloWolrdMainApplication {
    public static void main(String[] args) {

        // Spring 应用启动起来
        SpringApplication.run(HelloWolrdMainApplication.class, args);
    }
}

@SpringBootApplication:Spring Boot应用标注在某个类上说明这个类是SpringBoot主配置类。SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;


// SpringBootApplication

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};
}

@SpringBootConfiguration:Spring Boot配置类(@Configuration)。标注在某个类上,表示这是一个Spring Boot配置类。配置类 ----> 配置文件(之前)。配置类也是容器中的一个组件;@Component

@EnableAutoConfiguration:以前我们需要自己配置,现在Spring Boot帮我们自动配置。

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

@AutoConfigurationPackage:自动配置包,作用是将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器。由@Import({Registrar.class})生成,Spring的底层注解@Import@Import作用给容器导入一个组件。

四:编写相关的Controller、Service

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Created by apple on 2018/6/29.
 */

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String Hello() {
        return "Hello World";
    }
}

五、运行主程序测试

六、简化部署

  • 创建一个可执行的jar包,导入插件
<!-- 这个插件,可以将应用打包成一个可执行的jar包 -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

将这个应用打成jar包,直接使用java -jar命令进行执行。

Hello World分析

POM文件

  • 父项目
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!-- spring-boot-starter-parent父项目,真正管理Spring Boot应用里面的所有依赖版本,
我们Spring Boot的版本仲裁中心,以后我们导入依赖默认是不需要写版本的(如果没有在dependencies里面
管理的依赖则需要声明版本号) -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
</parent>

启动器

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

Spring-boot-starter-web:

spring-boot-starter: spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景启动器。

使用Spring Initializer快速创建Spring Boot项目

IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;

选择我们需要的模块;向导会联网创建Spring Boot项目;

默认生成的Spring Boot 项目:

  • 主程序已经生成好了,我们只需要我们自己的逻辑;

  • resources文件夹中目录结构

    • static: 保存所有的静态资源;js css images
    • templates: 保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
    • application.properties: Spring Boot应用的配置文件;可以修改一些默认配置;

Spring Boot配置

Spring Boot 多模块项目创建与配置

maven多模块项目通常由一个父模块和若干个子模块构成,每个模块都对应着一个pom.xml。它们之间通过继承和聚合(也称作多模块)相互关联。多模块适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。

多模块项目创建

  • 1 父模块创建

一、在界面左上角选择File->New->Project后,选择Spring Initializr,默认使用的Java版本是1.8。

二、点击Next,进入下一步,设置项目的一些基本信息。

三、点击Next,进入下一个选择dependency的界面,作用是在pom中自动添加一些依赖,在项目开始时就下载。

四、点击Next,进入下一个界面,填写工程名,并选择工程所在目录。填写完成后,点击Finish,即可创建一个spring boot项目。

  • 2 创建子模块

在上面创建好的工程名上,点击右键,选择New–>Module,进入New Module页面。我们把无用的文件及文件夹删掉,包括三个模块的mvnw、mvnw.cmd文件及.mvn文件夹,还有父模块的src目录,因为此处的父模块只做依赖管理,不需要编写代码。

到这里,一个父模块和两个子模块都创建完成啦~~

多模块项目配置

  • 父模块pom配置

父pom是为了抽取统一的配置信息和依赖版本控制,方便子pom直接引用,简化子pom的配置。

下面介绍下父pom的配置中需要注意的一些地方。我贴出的pom看起来会有点冗余,因为其中一些不需要的地方,我没有直接删掉而是注释掉,并加了说明,是为了后续查看的时候还能清楚删掉的原因。

  1. 父模块的打包类型

多模块项目中,父模块打包类型必须是pom,同时以给出所有的子模块,其中每个module,都是另外一个maven项目。

我们的项目中目前一共有两个子模块,springboot-mm-server和springboot-mm-client。后续新增的子模块也必须加到父pom的modules中。

  1. 继承设置

继承是maven中很强大的一种功能,继承可以使子pom获得parent中的各项配置,对子pom进行统一的配置和依赖管理。父pom中的大多数元素都能被子pom继承~~

maven项目之间的继承关系通过parent表示。这里使用的开发框架是spring boot,默认继承spring-boot-starter-parent。

  1. 使用dependencyManagement管理依赖版本号

一般在项目最顶层的父pom中使用该元素,让所有子模块引用一个依赖而不用显式的列出版本号。maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。

  1. 使用properties控制依赖包的版本号,便于版本维护

在properties标签中,添加各依赖包的版本号,然后在dependency中直接引用该依赖版本号的值即可。

父模块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>com.sosout.mm</groupId>
	<artifactId>springboot-multi-module</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<!-- <packaging>jar</packaging> -->
    <packaging>pom</packaging><!-- 父模块打包类型必须为pom -->

    <modules>
		<module>springboot-mm-client</module>
		<module>springboot-mm-server</module>
	</modules>

	<name>springboot-multi-module</name>
	<description>Demo project for Spring Boot</description>

    <!-- parent指明继承关系,给出被继承的父项目的具体信息-->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<!--该插件作用是打一个可运行的包,必须要写在需要打包的项目里。这里的父模块不需要打包运行,所以删掉该插件。-->
	<!--<build>-->
		<!--<plugins>-->
			<!--<plugin>-->
				<!--<groupId>org.springframework.boot</groupId>-->
				<!--<artifactId>spring-boot-maven-plugin</artifactId>-->
			<!--</plugin>-->
		<!--</plugins>-->
	<!--</build>-->

	<developers>
		<developer>
			<name>weich</name>
			<roles>
				<role>Developer</role>
			</roles>
			<timezone>+8</timezone>
		</developer>
	</developers>
</project>

yaml简介

配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的;

  • application.properties
  • application.yml

路径:配置文件放在src/main/resources目录或者类路径/config

配置文件的作用:修改SpringBoot自动配置的默认值;

YAML:正如YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。

YAML语法

  • 基本语法

k:(空格)v:表示一对键值对(空格必须有);以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级;属性和值也是大小写敏感;

  • 值得写法

字面量:普通的值(数字,字符串,布尔)

  1. k:(空格)v:字面直接来写。字符串默认不用加上引号或者双引号;

    "":双引号;不会转义字符串里面的特殊字符; name:"zhangsan \n lisi" : 输出:zhangsan 换行 lisi

    '':单引号;会转义特殊字符,特殊

Spring Boot日志

Spring Boot之Web开发

Spring Boot之Docker

Spring Boot数据访问

Spring Boot启动配置原理

Spring Boot自定义starters

Spring Boot缓存

Spring Boot消息

Spring Boot检索

Spring Boot任务

Spring Boot安全

Spring Boot分布式

Spring Boot开发热部署

Spring Boot监控管理

Spring Boot启动器

常用启动器

  • spring-boot-starter 核心模块,包含自动配置支持、日志库和对 YAML 配置文件的支持。

  • spring-boot-starter-web 支持 Web 应用开发,包含 Tomcat 和 spring-mvc、spring-webmvc。

  • spring-boot-starter-test 包含常用的测试所需的依赖,如 JUnit、Hamcrest、Mockito 和 spring-test 等。

Spring Boot 常用命令

执行打包完成的jar包

$ java -jar [jar-name]

Maven

Maven是什么?

Maven 是一个项目管理和综合工具。Maven 提供了开发人员构建一个完整的生命周期框架。开发团队可以自动完成项目的基础工具建设,Maven 使用标准的目录结构和默认构建生命周期。

在多个开发团队环境时,Maven 可以设置按标准在非常短的时间里完成配置工作。由于大部分项目的设置都很简单,并且可重复使用,Maven 让开发人员的工作更轻松,同时创建报表,检查,构建和测试自动化设置。

maven项目的groupid和artifactId

groupidartifactId 被统称为“坐标”是为了保证项目唯一性而提出的,如果你要把你项目弄到 maven 本地仓库去,你想要找到你的项目就必须根据这两个 id 去查找。

groupId 一般分为多个段,这里我只说两段,第一段为域,第二段为公司名称。域又分为 orgcomcn等等许多,其中 org 为非营利组织,com 为商业组织。举个 apache 公司的 tomcat 项目例子:这个项目的 groupIdorg.apache,它的域是 org(因为 tomcat 是非营利项目),公司名称是 apacheartigactIdtomcat

比如我创建一个项目,我一般会将 groupId 设置为 cn.wchcn 表示域为中国,wch 是我个人姓名缩写,artifactId 设置为 testProj,表示你这个项目的名称是 testProj,依照这个设置,你的包结构最好是 cn.wch.testProj 打头的,如果有个 StudentPeng,它的全路径就是 cn.wch.testProj.StudentPeng

上次更新: 2018-7-17 11:06:11