内嵌 web 容器

一个值得注意的地方是 Spring Boot 不再需要将应用部署到 Tomcat 服务器才能运行,这是因为它内嵌了 Tomcat 服务器

简单对比一下:

传统 web 程序,打 war 包,部署至 Tomcat,是 Tomcat 中运行了 Spring 程序

Spring Boot web 程序,打 jar 包,启动内嵌的 Tomcat,是 Spring 程序驱动了 Tomcat

优点:控制力更强了👍,原本不好管理的 Servlet、Filter 等都可以轻易使用 Spring 依赖注入等功能

优点:部署也更为方便👍,不需要单独安装 tomcat,有 java 运行环境即可

缺点:jar 包不支持 jsp

在引导类上添加 @ServletComponentScan 就可以将 Filter、Servlet 等纳入 Spring 管理

目前大伙都知道的是可通过两种通用方法来构建 Web 应用程序:在服务器上执行大部分应用程序逻辑的传统 Web 应用程序,以及在 Web 浏览器中执行大部分用户界面逻辑的单页应用程序 (SPA),后者主要使用 Web API 与 Web 服务器通信。 也可以将两种方法混合使用,最简单的方法是在更大型的传统 Web 应用程序中承载一个或多个丰富 SPA 类子应用程序。
何时应使用传统 Web 应用程序:

  • 应用程序的客户端要求简单,甚至要求只读。
  • 应用程序需在不支持 JavaScript 的浏览器中工作。
  • 团队不熟悉 JavaScript 或 TypeScript 开发技术。

何时应使用 SPA:

  • 应用程序必须公开具有许多功能的丰富的用户界面。
  • 团队熟悉 JavaScript 或 TypeScript 开发。
  • 应用程序已为其他(内部或公共)客户端公开 API。

此外,SPA 框架还需要更强的体系结构和安全专业知识。 相较于传统 Web 应用程序,SPA 框架需要进行频繁的更新和使用新框架,因此改动更大。 相较于传统 Web 应用,SPA 应用程序在配置自动化生成和部署过程以及利用部署选项(如容器)方面的难度更大。
所以如果你要使用 SPA 模型改进用户体验时必须权衡这些注意事项。

@SpringBootApplication注解分析

Spring boot简介

  • Spring Boot是伴随着Spring4.0 产生的,是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。
  • Spring Boot让我们的Spring应用变得更轻量化。比如:你可以仅仅依靠一个Java类来运行Spring引用。你也可以打包你的应用为jar并通过使用java –jar来运行你的Spring Web应用。
  • Spring Boot的主要优点:
    为所有Spring开发者更快的入门
    开箱即用,提供各种默认配置来简化项目配置
    内嵌式容器简化web项目
    没有冗余代码生成和xml配置的要求
    尽可能的根据项目依赖来自动配置Spring框架。
    提供可以直接在生产环境中使用的功能,如性能指标,应用信息和应用健康检查。
  • Spring Boot的缺点
    依赖太多,随便的一个Spring Boot应用都有好几十M
    缺少服务的注册和发现等解决方案,可以结合springcloud的组件使用。
    缺少监控集成方案、安全管理方案(有但简单,满足不了生产的指标)

SpringbootApplication:带有 main() 方法的类,用于启动应用程序。
application.properties:整个应用程序的配置文件,默认是空的 properties 文件,配置应用程序的端口号,程序名等属性,后面我们会一一讲到。
pom.xml:包依赖文件。

1.@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。 对于@ControllerAdvice,我们比较熟知的用法是结合@ExceptionHandler用于全局异常的处理,但其作用不止于此。 ControllerAdvice拆开来就是Controller Advice,关于Advice,在Spring的AOP中,是用来封装一个切面所有属性的,包括切入点和需要织入的切面逻辑。

@SpringBootApplication的第一个注解:@ComponentScan扫描的范围是引导类开始所在的包的范围(包及其子包内)
boot高级1.png

第二个,第三个是:
boot高级4.png

(1):@configuration
boot高级5.png
类怎么交给spring管理
第一种是直接在类上加@Component交给spring管理,
第二种在配置类里方法外写@bean,交给spring管理,
第三种@Import ,类交给spring管理:@Import({OtherService2.class,MyImporter.class})


@Configuration //标注了此注解的类称为配置类
@Import({OtherService2.class,MyImporter.class})//不是扫描,是导入(第三种类交给spring管理)
public class MyConfig1 {//配置类本身也是由spring容器管理

  1. @Bean //为了让@bean生效,把他放在配置类里(第二种类交给spring管理,第一种是直接在类上加@Component交给spring管理)<br /> public OtherService1 otherService1(){
  2. //返回的结果就被spring管理起来了<br /> return new OtherService1();<br /> }<br />}<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/27855821/1650532526855-209232bb-026f-46c3-851b-475e6fd25304.png#clientId=uab6abcef-35d5-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=572&id=u25c5a36a&margin=%5Bobject%20Object%5D&name=image.png&originHeight=644&originWidth=1239&originalType=binary&ratio=1&rotation=0&showTitle=false&size=173663&status=done&style=none&taskId=u70a2e925-47fb-4507-95c4-ac1c2090d55&title=&width=1101.3333333333333)

@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值