cnk4
1. 简介Spring以及其优缺点
Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。
我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发,比如说 Spring 支持 IoC(Inversion of Control:控制反转) 和 AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)、对单元测试支持比较好、支持 RESTful Java 应用程序的开发。
Spring也是重量级企业开发框架Enterprise JavaBean(EJB)的替代品,Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用POJO实现了EJB的功能。
缺点:虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量的xml配置)
为此,Spring 2.5 引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0 引入了基于Java 的配置,这是一种类型安全的可重构配置方式,可以代替 XML。
尽管如此,我们依旧没能逃脱配置的魔爪。开启某些 Spring 特性时,比如事务管理和 SpringMVC,还是需要用 XML或Java 进行显式配置。启用第三方库时也需要显式配置,比如基于Thymeleaf的 Web 视图。配置 Servlet 和过滤器(比如 Spring 的 DispatcherServlet ) 同样需要在web.xml或Servet 初始化代码里进行显式配置。组件扫描减少了配置量,Java 配置让它看上去简洁不少,但 Spring 还是需要不少配置。
光配置这些 XML 文件都够我们头疼的了,占用了我们大部分时间和精力。除此之外,相关库的依赖非常让人头疼,不同库之间的版本冲突也非常常见。
依赖注入
依赖注入是实现控制反转的一种设计方法,它有三种类型分别为构造函数注入,属性注入以及方法注入。一个依赖关系指的是可被利用的一种对象 。依赖注入是将所依赖的传递给将要使用的从属对象。 依赖注入的类型:
注入类将服务(依赖项)注入客户端(依赖),可分为以下几种形式
(1)构造函数注入:在构造函数注入中,注入器通过客户端类构造函数提供服务(依赖性)。
(2)属性注入:在属性注入(又名Setter注入)中,注入器通过客户端类的公共属性提供依赖性。
(3)方法注入:在这种类型的注入中,客户端类实现一个接口,该接口声明方法以提供依赖性,并且注入器使用此接口来提供对客户端类的依赖性。
依赖注入的好处:
(1)减少依赖性
依赖注入可以消除或者减少组件间不必要的依赖性。以降低组件改变时所带来的影响组件
(2)增强可重用性
减少组件依赖性可以增强组件的可重用性。如果在不同的上下文中需要某个接口的不同实现,或者只是同一实现的不同配置,则可以将该组件配置为使用该实现。无需更改代码。
(3)增加代码的可测试性
依赖注入也增加了组件的可测试性。当依赖项可以注入组件时,意味着可以注入这些依赖项的模拟实现。模拟对象用于测试作为实际实现的替代,并且可以配置模拟对象的行为
(4)增强代码的可读性
依赖注入可将依赖项移动到组件的接口。使得更容易看到组件中哪些具有依赖关系,从而使代码更具可读性。
(5)减少依赖性承载
依赖性承载会在代码中产生大量“噪音”,使其难以阅读和维护,并且使得组件更难测试。而依赖注入可以减少依赖性承载和静态单例的使用,可以将组件完美地连接在一起
2. 为什么要有SpringBoot
Spring 旨在简化J2EE 企业应用程序开发。Spring Boot 旨在简化 Spring 开发(减少配置文件,开箱即用!)。
3. 说出使用Spring Boot的主要优点
- 开发基于 Spring 的应用程序很容易。
- Spring Boot 项目所需的开发或工程时间明显减少,通常会提高整体生产力。
- Spring Boot 不需要编写大量样板代码、XML 配置和注释。
- Spring 引导应用程序可以很容易地与 Spring 生态系统集成,如 Spring JDBC、Spring ORM. Spring Data、Spring Security 等。
- Spring Boot 遵循“固执己见的默认配置”,以减少开发工作(默认配置可以修改)
- Spring Boot 应用程序提供嵌入式 HTTP 服务器,如 Tomcat 和 Jetty,可以轻松地开发和测试web 应用程序。(这点很赞!普通运行 Java 程序的方式就能运行基于 Spring Boot web 项目省事很多)
- Spring Boot 提供命令行接口(CL)工具,用于开发和测试 Spring Boot 应用程序,如 Java 或Groovy.
- Spring Boot 提供了多种插件,可以使用内置工具(如 Maven 和 Gradle)开发和测试 SpringBoot 应用程序
4. 什么是Spring Boot Starters?
Spring Boot Starters 是一系列依赖关系的集合,因为它的存在,项目的依赖之间的关系对我们来说变的更加简单了。
举个例子: 在没有 Spring Boot Starters 之前,我们开发 REST 服务或 Web 应用程序时: 我们需要使用像 Spring MVC,Tomcat 和 Jackson 这样的库,这些依赖我们需要手动一个一个添加。但是,有了Spring Boot Starters 我们只需要一个只需添加一个spring-boot-starter-web一个依赖就可以了,这个依赖包含的子依赖中包含了我们开发 REST 服务需要的所有依赖。
5. Srping Boot支持哪些内嵌Servlet容器?
6. 如何在 Spring Boot 应用程序中使用 Jetty 而不是 Tomcat?
Spring Boot ( spring-boot-starter-web ) 使用Tomcat 作为默认的嵌入式 servlet容器,如果你想使用 Jetty 的话只需要修改 pom.xml (Maven)或者 build.gradle (Gradle)就可以了。
7. 介绍@SpringBootApplication注解
可以看出大概可以把 @SpringBootApplication 看作是 @Configuration 、@EnableAutoConfig和 @Componentscan 注解的集合。根据 SpringBoot 官网,这二个注解的作用分别是:
- @EnableAutoConfiguration : 启用 SpringBoot 的自动配置机制
- @ComponentScan : 扫描被 @Component ( @Service,@Controller )注解的 bean,注解默认会扫描该类所在的包下所有的类。
- @Configuration : 允许在上下文中注册额外的 bean 或导入其他配置类
8. Spring Boot 的自动配置是如何实现的?
Spring Boot 的自动配置是通过条件化配置来实现的。其核心思想是根据项目中存在的 jar 包或者类的存在与否来判断需要配置哪些功能。这些条件化配置会在 Spring Boot 应用启动时自动执行,从而实现自动配置。
具体来说,Spring Boot 通过 Spring 的条件化注解来实现条件化配置,例如 @ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty 等。通过这些条件化注解,可以实现当项目中包含某些 jar 包或者类时,自动配置某些功能;或者当某个 Bean 不存在时,自动配置该 Bean 等。
另外,Spring Boot 还提供了 Starter 的概念,即 Starter 是一种预先配置好的一组 jar 包,可以用来快速启动某些功能。Starter 中通常包含了所需的 jar 包和自动配置类。因此,通过引入 Starter,可以非常方便地启动一些常用功能,而无需手动进行配置。
9. 开发RESTful Web服务常用的注解有哪些
Spring bean相关:
- @Autowired
- @RestController
- @Component
- @Repsitory
- @service
- @Controller
处理常见的HTTP请求类型:
- @GetMapping
- @PosMapping
- @PutMapping
- @DeleteMapping
前后端传值
- @RequestParam以及@Pathvairable
- @RequestBody
@RequestParam和@PathVariable都是Spring MVC中用于接收请求参数的注解,但它们的使用场景和参数来源有所不同。
@RequestParam用于获取请求参数,它可以获取查询参数或POST请求中的表单数据。使用@RequestParam注解时,可以指定参数的名称和是否必须。如果不指定参数名称,则默认使用方法参数名。如果参数是必须的但请求中没有该参数,将会抛出异常。
@PathVariable用于获取请求路径中的占位符,一般用于RESTful风格的接口。使用@PathVariable注解时,需要在注解中指定占位符的名称,然后在方法参数中使用同名变量接收值。
简单来说,@RequestParam用于接收请求参数,@PathVariable用于接收请求路径中的占位符参数。
10. SpringBoot常用的两种配置文件
- application.properties
- application.yml
11. 什么是YAML?YAML配置的优势在哪里?
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。
相比于 Properties 配置的方式,YAML配置的方式更加直观清晰,简介明了,有层次感。
但是,YAML配置的方式有一个缺点,那就是不支持 @PropertySource 注解导入自定义的 YAML配置。如果需要加载自定义的 YAML 配置文件,可以通过以下方式来实现:
- 通过 @ImportResource 注解导入 XML 配置文件,然后在 XML 文件中使用 context:property-placeholder 标签加载 YAML 文件,这样就能够将 YAML 文件中的属性注入到 Spring 中的 Bean 中。
- 在 Spring Boot 应用程序中,可以使用 @ConfigurationProperties 注解来读取 YAML 文件中的属性,同时也可以使用 @PropertySource 注解来加载自定义的 YAML 配置文件。
需要注意的是,@ConfigurationProperties 注解只能读取 application.yml 或者 application.properties 文件中的属性,如果需要读取其他的 YAML 文件,还需要通过 @PropertySource 注解来加载。