概念
- Spring是一个生态体系(也可以说是技术体系),是集大成者,它包含了Spring Framework、Spring Boot、Spring Cloud等(还包括Spring Cloud data flow、spring data、spring integration、spring batch、spring security、spring hateoas)。
- Spring Framework是整个Spring生态的基石。Spring官方对Spring Framework简短描述:为依赖注入、事务管理、WEB应用、数据访问等提供了核心的支持。
- SpringMVC是基于Spring的一个MVC框架,用以替代初期的SSH框架。 Spring Framework本身没有Web功能,Spring MVC使用了WebApplicationContext类扩展ApplicationContext,使得拥有Web功能。
- Spring Boot是基于Spring全家桶的一套快速开发整合包。以前的Java Web开发模式:Tomcat + WAR包。WEB项目基于Spring framework,项目目录一定要是标准的WEB-INF + classes + lib,而且大量的xml配置。Spring Boot为快速启动且最小化配置的spring应用而设计,并且它具有用于构建生产级别应用的一套固化的视图(约定)。
- Spring Cloud事实上是一整套基于Spring Boot的微服务解决方案。它为开发者提供了很多工具,用于快速构建分布式系统的一些通用模式,例如:配置管理、注册中心、服务发现、限流、网关、链路追踪等。
跟着文档开始
基于Maven进行依赖包管理
创建一个pom.xml,用于管理项目的依赖
spring-boot-starter-parent是一个特殊的启动器,提供有用的Maven默认值。
使用 mvn dependency:tree 可以打印项目的依赖项树形结构1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<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.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
// 配置依赖性
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
// 打包配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>来一个Hello World
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
public class Example {
"/") (
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
- @RestController 是一个构造性注释,代表这是一个Controller类
- @RequestMapping 是一个路由注释
- 上面这两个注释都是基于Spring MVC
- @EnableAutoConfiguration 注释告诉Spring Boot根据你添加的jar依赖关系“猜测”你想要如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,因此自动配置假定您正在开发Web应用程序并相应地设置Spring。
- 运行
利用IDE 的 “RUN”, 活着 mvn spring-boot:run,可以看到启动了嵌入了Tomcat服务器在8080端口。 - 打包
在pom.xml配置了build配置项后,运行mvn package会在target目录打包出一个可执行文件myproject-0.0.1-SNAPSHOT.jar跟一个myproject-0.0.1-SNAPSHOT.jar.original小文件。通过以下命令可以直接运行这个jar包。1
java -jar target/myproject-0.0.1-SNAPSHOT.jar
Spring Boot的使用
- Starters是一组方便的依赖描述符,您可以在应用程序中包含这些描述符。您可以获得所需的所有Spring和相关技术的一站式服务。通常以 spring-boot-starter-* 命名。Starters列表可以参考文档。
构建代码
- package命名
- @SpringBootApplication 放在主类
使用@SpringBootApplication Annotation
- @EnableAutoConfiguration:启用Spring Boot的自动配置机制
- @ComponentScan:对应用程序所在的软件包启用@Component扫描
- @Configuration:允许在上下文中注册额外的beans或导入其他配置类
- @SpringBootApplication注释等效于使用@Configuration、@EnableAutoConfiguration、@ComponentScan及其默认属性。
Spring Boot注解
- @Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
- @EnableAutoConfiguration 自动配置。
- @ComponentScan 组件扫描,可自动发现和装配一些Bean。
- @Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。
- @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。
- @Autowired自动导入。
- @PathVariable获取参数。
- @JsonBackReference解决嵌套外链问题。
- @RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。
- @Import:用来导入其他配置类。
- @ImportResource:用来加载xml配置文件。
- @Service:一般用于修饰service层的组件。
- @Repository:使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。
- @Bean:用@Bean标注方法等价于XML中配置的bean。
- @Value:注入Spring boot application.properties配置的属性的值
- @Inject:等价于默认的@Autowired,只是没有required属性;
- @Qualifier:当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者。
- @Resource(name=”name”,type=”type”):没有括号内内容的话,默认byName。与@Autowired干类似的事。
JPA注解
- @Entity:@Table(name=”“):表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话,@Table可以省略
- @MappedSuperClass:用在确定是父类的entity上。父类的属性子类可以继承。
- @NoRepositoryBean:一般用作父类的repository,有这个注解,spring不会去实例化该repository。
- @Column:如果字段名与列名相同,则可以省略。
- @Id:表示该属性为主键。
- @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
- @SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
- @Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
- @JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
- @JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
- @OneToOne、@OneToMany、@ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一。
SpringMVC注解
- @RequestMapping:@RequestMapping(“/path”)表示该控制器处理所有“/path”的UR L请求。RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
@RequestParam:用在方法的参数前面。
1
2
String a =request.getParameter(“a”)。@PathVariable:路径变量。
异常注解
- @ControllerAdvice:包含@Component。可以被扫描到。统一处理异常。
- @ExceptionHandler(Exception.class):用在方法上面表示遇到这个异常就执行以下方法。
参考:
Spring Boot 中文文档
面试官问我:spring、springboot、springcloud的区别,我笑了