SpringBoot之基础

Posted milkywaygalaxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot之基础相关的知识,希望对你有一定的参考价值。

简介

背景

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

特点

① 快速创建独立运行的spring项目以及主流框架集成

② 使用嵌入式的Servlet容器, 应用无需达成war包

③ starters自动依赖和版本控制

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

⑤ 无需配置xml文件, 无代码生成, 开箱即用

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

⑦ 与云计算的天然集成

微服务

推荐martinfowler的一篇博客译文: http://blog.cuicc.com/blog/2015/07/22/microservices/

微服务是一种架构风格, 一个应用应该是一组小型服务, 可以通过http的方式进行互通.

以前的架构: 单体应用(ALL IN ONE)

技术分享图片技术分享图片?

微服务(Microservices): 每一个服务都是可替代可升级的软件单元

技术分享图片技术分享图片?

每个服务之间通过http进行通信:

技术分享图片技术分享图片?

准备工作

JDK1.8

maven3.3.9

IDEA_2018

配置指定maven的全局JDK版本: 在setting.xml文件中的<profiles></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>
技术分享图片

第一个例子

① 创建一个maven工程(jar)

② 导入spring boot相关的依赖

<?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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    <groupId>com.idea.springboot</groupId>
    <artifactId>spring-boot-01-helloworld</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>

    <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>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <!--将应用打包成一个可执行的jar包-->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
技术分享图片

 ③ 编写一个主程序, 启动Spring Boot应用

/**
 * @Date 18/12/06/006 - 8:54
 * @Desc springboot第一个例子
 * @SpringBootApplication  标注一个主程序类 说明这是一个Spring Boot应用
 */
@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) {
        //spring应用启动起来
        SpringApplication.run(HelloWorldMainApplication.class, args);
    }
}
技术分享图片

④ 编写相关的Controller

@Controller
public class HelloController {

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World!";
    }
}
技术分享图片

⑤ 运行主程序测试, 访问: http://localhost:8080/hello

⑥ 简化部署(使用插件打成jar, 插件在pom文件中已给出)

探究

① pom文件

  父项目:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
技术分享图片

再依赖父项目:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
    </parent>
技术分享图片

管理Spring Boot的所有依赖版本: 导入依赖默认是不需要写上版本的(没有在dependencies管理中的除外)

技术分享图片技术分享图片?

 ② 导入的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
技术分享图片

spring-boot-starter: Spring Boot的场景启动器

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

技术分享图片技术分享图片?

Spring Boot将所有的功能场景都抽取出来, 做成一个个的starter(启动器), 只需要在项目中引入这些starter, 要用哪个功能就导入具体的starter即可.

③ 主程序类/主入口类

@SpringBootApplication注解, 该注解所标准的类即为SpringBoot的主配置类

技术分享图片技术分享图片?

    @SpringBootConfiguration

        @Configuration: 配置类上的注解

            @Component: 组件注解

                配置类: 同配置文件的作用, 也是容器的组件.

    @EbableAutoConfiguration: 开启自动注解功能

        @AutoConfigurationPackage: 自动配置包(自动导包)

            @Import({Registrar.class}): Spring的底层注解, 给容器中导入一个组件

        将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包的所有组件都扫描到容器中

        @Import({ AutoConfigurationImportSelector.class}): 导入具体组件的选择器

        将所有需要导入的组件以全类名的方式返回, 这些组件就会被添加到容器中.

        会给容器中导入非常多的自动配置类(xxxAutoConfiguration): 给容器中导入这个场景需要组件并配置好这些组件.

技术分享图片技术分享图片?

技术分享图片技术分享图片?

        有了自动配置类, 免去了手动编写配置注入功能组件的工作.

    SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, ClassLoader);

        该方法从文件"META-INF/spring.factories"中获取自动配置的类信息.

技术分享图片技术分享图片?

小结: SpringBoot在启动时从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值, 将这些值作为自动配置类导入到容器中, 自动配置类就会生效, 进行自动配置工作, 所以并不是不需要进行以前的配置, 只是这些配置都由SpringBoot帮我们完成了. J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar

使用Spring Initializr快速创建SpringBoot项目(需要联网)

① 选择Spring Initializr

技术分享图片技术分享图片?

② 填写信息

技术分享图片技术分享图片?

③ 需要哪个模块勾选哪个即可

技术分享图片技术分享图片?

④ next->finish

⑤ resources文件夹中的目录结构

    static文件夹: 保存所有的静态资源(js, css...);

    templates文件夹: 保存所有的模板页面(由于SpringBoot使用嵌入式的tomcat, 所以默认不支持jsp), 可以使用模板引擎                    (freemarker/ thymeleaf)

    application.properties: SpringBoot应用的配置文件(可以修改一些默认的设置)

以上是关于SpringBoot之基础的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot系列之入门篇

DOM探索之基础详解——学习笔记

重学SpringBoot系列之基础知识回顾

SpringBoot启动报错“Consider defining a bean of type ‘xxx.mapper.UserMapper‘ in your configuration.“(代码片段

Java基础之方法的调用重载以及简单的递归

python之基础篇——模块与包