01- SpringBoot 入门

SpringBoot

SpringBoot 入门

概念

Spring Boot 是由 Pivotal 团队提供用来简化 Spring 的搭建和开发过程的全新框架。随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的热点技术。
Spring Boot 去除了大量的 xml 配置文件,简化了复杂的依赖管理,配合各种 starter 使用,基本上可以做到自动化配置。Spring 可以做的事情,现在用 Spring boot 都可以做。

回顾Spring IOC

Spring 的 IoC 容器中发生的事情其实也很简单,总结下来即两个阶段:
采摘和收集“咖啡豆”(bean)
研磨和烹饪咖啡

Spring IoC 容器的依赖注入工作可以分为两个阶段:
1)收集和注册
第一个阶段可以认为是构建和收集 bean 定义的阶段,在这个阶段中,我们可以通过 XML 或者 Java 代码的方式定义一些 bean,然后通过手动组装或者让容器基于某些机制自动扫描的形式,将这些 bean 定义收集到 IoC 容器中。

假设我们以 XML 配置的形式来收集并注册单一 bean,一般形式如下:
<bean id="mockService" class="..MockServiceImpl"> ...</bean>

如果嫌逐个收集 bean 定义麻烦,想批量地收集并注册到 IoC 容器中,我们也可以通过 XML Schema 形式的配置进行批量扫描并采集和注册:
<context:component-scan base-package="cn.bdqn">

注意基于 JavaConfig 形式的收集和注册,不管是单一还是批量,后面我们都会单独提及。
2)分析和组装
当第一阶段工作完成后,我们可以先暂且认为 IoC 容器中充斥着一个个独立的 bean,它们之间没有任何关系。

但实际上,它们之间是有依赖关系的,所以,IoC 容器在第二阶段要干的事情就是分析这些已经在 IoC 容器之中的 bean,然后根据它们之间的依赖关系先后组装它们。

如果 IoC 容器发现某个 bean 依赖另一个 bean,它就会将这另一个 bean 注入给依赖它的那个 bean,直到所有 bean 的依赖都注入完成,所有 bean 都“整装待发”,整个 IoC 容器的工作即算完成。

至于分析和组装的依据,Spring 框架最早是通过 XML 配置文件的形式来描述 bean 与 bean 之间的关系的,随着 Java 业界研发技术和理念的转变,基于 Java 代码和 Annotation 元信息的描述方式也日渐兴盛(比如 @Autowired 和 @Inject),但不管使用哪种方式,都只是为了简化绑定逻辑描述的各种“表象”,最终都是为本阶段的最终目的服务。

很多 Java 开发者一定认为 Spring 的 XML 配置文件是一种配置(Configuration),但本质上,这些配置文件更应该是一种代码形式,XML 在这里其实可以看作一种 DSL,它用来表述的是 bean 与 bean 之间的依赖绑定关系,如果没有 IoC 容器就要自己写代码新建(new)对象并配置(set)依赖。

创建 SpringBoot 项目

三种方式可以创建SpringBoot 项目

  • 新建Maven 工程 手动创建
  • 使用SpringBoot 官网上的快速入口创建
  • 使用 IDEA SpringBoot 模板创建

(一) 使用maven 手动搭建环境

创建maven 项目

只需要创建普通的maven 项目就好

导入Springboot 项目依赖

父级依赖

 <parent>
    <groupId>org.springframework.boot</groupId>
    <!-- 这个特殊的依赖包含了应用运行需要的所有信息,它包含了Spring Boot应用所必须的类似于Spring FrameWork(spring-core)、
    Spring Test(spring-test)等基础依赖的依赖描述。你只需要使用这个parent pom就能完成所有的依赖描述添加工作。-->
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath/>
  </parent>

本身依赖

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

搭建 目录结构

java
resources
	|- resources
	|- public
	|- static
	|- templates
	|- application.properties 或者  application.yml 格式

书写测试代码

web层Controller

package com.example.springboot_demo;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class Demo {

    @RequestMapping("hello")
    public String hello(){
        return "Hello SpringBoot";
    }
}

程序入口

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

核心注解

@SpringBootApplication
// 一个复合注解, 含有诸多配置功能

(二) 快速创建springboot项目

官网 方式

IDEA 方式

SpringBoot 目录结构

java
resources
		|- resources
		|- public
		|- static
		|- templates
		|- application.properties 或者  application.yml 格式

static 目录

用于存放静态资源,如图片、CSS、JavaScript等

templates目录

用于存放Web页面的模板文件

application.properties/application.yml

用于存放程序的各种依赖模块的配置信息,比如 服务端口,数据库连接配置等。。。\

需要注意的是

  • 默认情况下,Spring Boot 的静态文件加载顺序是
    META/resources > resources > static > public 里面找是否存在相应的资源,
    如果有则直接返回。
  • 使用@Controller与@ResponseBody 返回值的方式, 返回一个html文件,则需要将html文件放到templates文件夹下。

SpringBoot 核心配置文件

约定大于配置的方式 取代 SpringBoot大部分默认配置

使用Properties的方式

# 修改默认端口号
server.port=80

使用yml的方式

基本语法

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

举例

server:
  port: 8080
  servlet:
    context-path: /

SpringBoot 热部署

两种方式完成

使用devtools

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>

添加配置文件

application.properties 方式配置文件

# 禁用缓存
spring.thymeleaf.cache=false
#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
#spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
spring.devtools.restart.exclude: WEB-INF/**

需要设置IDEA的自动编译:

1- File-Settings-Compiler-Build Project automatically

2- ctrl + shift + alt + /,选择Registry,勾上 Compiler autoMake allow when app running
( 也可以ctrl+shift+A——双击Registry  )

SpringBoot 常用注解

核心注解

@SpringBootApplication 只会扫描 平级目录或者子目录, 不能向上扫描

这里只有一个注解@SpringBootApplication,但是作用却大得惊人,control键然后点击该注解看源码可知它替代了@@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan这三个注解的功能。接下来解释这个三个注解的作用,理解了这三个注解,自然理解了@SpringBootApplication。

分解分析

1- @SpringBootConfiguration:该注解继承自@Configuration,一般与@Bean配合使用,使用这两个注解就可以创建一个简单的spring配置类,可以用来替代相应的xml配置文件。

2- @EnableAutoConfiguration:该注解的意思就是Springboot可以根据你添加的jar包来配置你项目的默认配置,比如当你添加了mvc的jar包,它就会自动配置web项目所需的配置

3- @ComponentScan:顾名思义该注解是用来扫描组件的,只要组件上有@component及其子注解@Service、@Repository、@Controller等,springboot会自动扫描到并纳入Spring 容器进行管理,有点类似xml文件中的<context:component-scan>,该注解不填属性的话就是默认扫描启动类所在的包,或者启动类所在包的下一级,所以启动类要放在最外层.

常用注解回顾

controller层:

	1、@Controller
		@Controller 用来响应页面,表示当前的类为控制器。
	2.1、@ResponseBody
		把数据转换为Json 格式 返回
	2.2、@RestController
		@RestController 是@ResponseBody和@Controller的结合
		表明当前类是控制器且返回的是一组数据,不是页面

	3.1、@Autowired
		这个注解的作用是将其他的类,接口引入,类似于之前的类的初始化等,用这个注解,类中或接口的方法就可以直接调用了。
		
	3.2、@Resource
		默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配
		虽然不是 spring的注解(@Resource(importjavax.annotation.Resource;)是J2EE的注解,)
		
	4、@RequestMapping
		当前台界面调用Controller处理数据时候告诉控制器怎么操作
		作用:URL映射。

	5、@GetMapping
		@RequestMapping(method = RequestMethod.GET)的简写
		作用:对应查询,表明是一个查询URL映射

	6、@PostMapping
		@RequestMapping(method = RequestMethod.POST)的简写
		作用:对应增加,表明是一个增加URL映射

	7、@PutMapping
		@RequestMapping(method = RequestMethod.PUT)的简写
		作用:对应更新,表明是一个更新URL映射

	8、@DeleteMapping
		@RequestMapping(method = RequestMethod.DELETE)的简写
		
	9.1 @PathVariable
		使用@PathVariable时,URL是这样的:http://host:port/path/参数值
	9.2 @RequestParam
		使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值
service层:
	1.@service
		用于标注业务层组件
dao层:
	1.@Repository
		是用来注解接口,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常
配置:

@PropertySource 和 @ Value

新建配置文件 db.properties

键=值

新建实体类

@Component
@PropertySource("classpath:db.properties")
class XX{
	@Value("${url}")
    private String 属性;
    // get set...
}

测试类注入 XX类

@Autowired
private XX xx;

ConfigurationProperties

**注入属性值 **

配置文件

student:
  name: zhangsan

相对应的学生类

@ConfigurationProperties(prefix = "student")
@Component
public class Student {
    private String name;

测试类

@RestController
public class Demo {
    @Autowired
    private Student stu;

    @Autowired
    private Student student;

    @RequestMapping("/hello")
    @ResponseBody
    public List hello(){
        ArrayList<Object> list = new ArrayList<>();
        list.add(student);
        return list;
    }
}

当用户访问 hello 时, 能够获取到 配置文件中设置的 学生的name值
中文乱码问题 记得修改全局编码格式 为UTF-8

后续内容

# 整合 Thymeleaf 模板引擎
# 整合Mybatis
# 整合redis
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章