<Spring/SpringBoot实战>学习笔记
现在在看这本书,虽然评价不是很高,但我觉得还是很适合我这种入门者的。书中是把Spring和SpringBoot融合在一起来讲了。
之前写过六七个Spring Boot和Spring的Demo小项目,可那只是抄抄改改别人的代码而已,没有深入理解。 ????
我现在的心情还是挺兴奋的,因为我知道SpringBoot的功能很强大,学起来是蛮有成就感的,而且我印象中这个特别神奇,写点注解就行,不像原生Spring那样要配置很多XML。
第1章 Spring起步
1.1 什么是Spring
应用程序都是由很多组件组成的,当应用程序运行时,需要以某种方式创建并引入这些组件。
Spring的核心是提供了一个容器(container),称为Spring应用上下文(Spring application context),它们会创建和管理应用组件(也可以称为bean),bean会在Spring应用上下文中装配在一起,从而形成一个完整的应用程序。
将bean装配在一起的行为是通过基于依赖注入(dependency injection,DI)的模式实现的。使用DI的应用依赖于单独的实体(容器)来创建和维护所有的组件,并将其注入到它们的bean中。这通常通过构造器参数和属性访问方法实现的。
如图,商品服务依赖于库存服务。
在核心容器之上,Spring及其一系列的相关库提供了Web框架、各种持久化可选方案、安全框架、与其他系统集成、运行时监控、微服务支持、反应式编程以及众多现代应用开发必需的特性。
历史上,指导Spring应用上下文将bean装配在一起的方式是使用一个或多个XML文件(描述各个组件以及它们与其他组件的关联关系)。如下面的XML代码,通过构造器参数将InventoryService装配到ProductService bean中:
但,基于Java的配置更为常见。如下基于Java的配置类是与XML配置等价的:
@Configuration注解告知Spring这是一个配置类,会为Spring应用上下文提供bean。这个配置类的方法使用@Bean注解进行了标注,表明这些方法所返回的对象会以bean形式添加到Spring application context中(默认情况下,bean所对应的bean ID与定义它们的方法名称是相同的。
随着Spring Boot的引入,自动配置的能力已经远远超出了组件扫描和自动装配。Spring Boot能够基于类路径中的条目、环境变量和其他因素合理猜测需要配置的组件并将它们装配在一起。
1.2 初始化Spring应用
Spring Initializr是一个基于浏览器的Web应用,能够生成要给Spring项目结构的骨架。
引导应用
要通过可执行JAR文件的形式来运行应用,所以要有一个主类(引导类),它将会在JAR运行的时候被执行。我们同时还需要一个最小化的Spring配置,以引导该应用。
@SpringBootApplication注解表明这是一个Spring Boot应用,是一个组合注解,组合了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan三个注解。
- @SpringBootConfiguration:将该类声明为配置类,后续可以按需添加基于Java的Spring框架配置。
- @EnableAutoConfiguration:启用Spring Boot的自动配置。
- @ComponentScan:启用组件扫描。这样就可以通过像@Component、@Controller、@Service这样的注解声明其他类,Spring会自动发现它们并将它们注册为Spring应用上下文中的组件。
Application类的main()方法是JAR文件执行时要运行的方法。
这个main()方法会调用SpringApplication中的静态run()方法,后者会真正执行应用的引导过程,也就是创建Spring的应用上下文。在传递给run()的两个参数中,一个是配置类,另一个是命令行参数。尽管传递的配置类不一定要和引导类相同,但这是最便利和典型的做法。
测试应用
ApplicationTests类中的内容并不多:只有一个空的测试方法。
我们已经看完了Spring Initializr为我们提供的代码。这是开发Spring应用程序的基础样板。
1.3 编写Spring应用
为应用添加一个主页,将创建两个代码构建:
- 一个控制器类,用来处理主页相关的请求;
- 一个视图模版,用来定义主页看起来的样子。
还会编写一个简单的测试类来测试主页。
1.3.1 处理Web请求
Spring自带一个强大的Web框架——Spring MVC。它的核心是控制器(controller)的理念。控制器是处理请求并以某种方式进行信息响应的类。在面向浏览器的应用中,控制器会填充可选的数据模型并将请求传递给一个视图,以便于生成返回给浏览器的HTML。
书中是处理对根路径("/")的请求,并将这些请求转发至主页视图,在这个过程中不会填充任何的模型数据。
@Controller的主要目的是让组件扫描将这个类识别为一个组件。Spring还会创建一个HomeController实例作为Spring应用上下文中的bean。
@Component、@Service和@Repository也可以添加在控制类,作用是完全相同的。但选择使用@Controller更能描述这个组件在应用中的角色。
home()是一个简单的控制器方法。带有@GetMapping注解,表明如果针对"/"发送 HTTP GET请求,那么home()方法将会处理请求。该方法所做的知识返回String类型的home值。
这个值将会被解析为视图的逻辑名。视图如何实现取决于多个因素,但因为Thymeleaf位于类路径中,所以可以用Thymeleaf来定义模版。
控制类也可以这样写:
@RestController 注解: 该注解是 @Controller 和 @ResponseBody 注解的合体版
暂时停更,觉得这种写笔记的方法太浪费时间了。还是直接对照我以前写的demo项目来学习这本书吧。