软件模块化是一种软件开发的设计模式,它将一个大型的软件系统划分成多个独立的模块,每个模块都有自己的功能和接口,并且能够与其他模块独立地工作1. 软件模块化设计可以使软件不至于随着逐渐变大而变得不可控,最终要达到可控、可维护、可扩展的目的2
将软件用户界面和业务逻.辑分离
每一层承担特定的职能,高层依赖于低层辑分离
具体技术
分布式服务器
- 提高代码的复用性:模块化可以将代码划分成可重用的部分,降低代码的冗余和重复,提高代码的复用性。
- 简化代码的维护和调试:当一个软件系统变得越来越复杂时,进行模块化开发可以使得每个模块都相对独立,这样就可以方便地维护和调试每个模块,而不必考虑整个系统的复杂性。
- 提高代码的可读性:模块化可以使得代码更加结构化,清晰明了,从而提高代码的可读性和可维护性。
- 提高开发效率:模块化开发可以使得团队成员在不同模块上并行开发,从而提高开发效率。
- 降低项目的风险:模块化开发可以使得开发
总之,模块化开发是一种有效的软件开发模式,可以提高软件开发的质量、效率和可维护性,特别是在大型软件系统的开发中,模块化更是必不可少的。
Spring技术栈提供了Servlet和反应式这两种Web技术栈,在应用层面充分向异步和非阻塞并发靠拢。Spring MVC为现有的应用程序提供了一些反应式特性。Spring Boot 2内置了反应式Web容器,默认使用的是Netty,当然也可以选择Tomcat、Jetty或Undertow,应用程序可以分别通过Spring MVC(spring-webmvc模块)和Spring WebFlux(spring-webflux模块)来使用这两个技术栈。
- 通讯功能
- Servlet对象的生命周期管理
- 多线程支持
- 安全性支持
Servlet和JSP的区别如下:Servlet在Java代码中可以通过HttpServletResponse对象动态输出HTML内容,而JSP是在静态HTML内容中嵌入Java代码,然后Java代码在被动态执行后生成HTML内容。JSP可以方便地实现页面的动态生成,可以更好地实现MVC模式,而Servlet更适合处理业务逻辑。JSP的执行过程是先编译成Servlet,再由Servlet容器进行执行。因此,JSP的执行效率比Servlet低
Spring容器来负责创建对象并把对象关联起来提供服务。
- 容器提供了公共服务
- 容器依赖于配置信息
Spring拥有两种类型的容器
BeanFactory
BeanFactorv负责读取bean配置信息,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的生命周期,每次获取对象时才会创建对象
ApplicationContext
ApplicationContext由BeanFactory派生而来, 同时也继承了容器的高级功能,如:MessageSource(国际化资源接口)、ResourceLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布接口)等,提供了更多面向实际应用的功能。在容器启动时就会创建所有的对象
控制反转是指Bean对象之间的依赖不由它们自己管理,而是由Spring容器负责管理对象之间的依赖
Spring容器采用依赖注入(DI)的方式实现控制反转
解释
控制反转和依赖注入是两个相关的软件设计原则,它们的目的是降低代码之间的耦合度,提高可维护性和可测试性。控制反转(Inversion of Control,IoC)是一种思想,它指的是将对象的创建和管理交给一个外部容器,而不是由对象自己控制。依赖注入(Dependency Injection,DI)是实现控制反转的一种常用方法,它指的是在对象创建时,由容器将对象所依赖的其他对象注入到它的属性或构造方法中。这样,对象就不需要自己创建或查找依赖的对象,而只需要声明它们的类型或名称
举例
例如,假设有一个类A,它依赖于另一个类B。如果没有控制反转和依赖注入,类A可能会在自己的构造方法中使用new关键字来创建一个类B的实例。这样,类A就和类B紧密耦合在一起,如果类B发生了变化,类A也需要修改。而且,这样的代码很难进行单元测试,因为类A无法替换掉类B的实例。
如果使用了控制反转和依赖注入,类A就不需要自己创建类B的实例,而是将它作为一个参数传入自己的构造方法中。这样,类A就只需要知道类B的接口,而不需要关心它的具体实现。而且,这样的代码更容易进行单元测试,因为类A可以使用模拟对象(mock object)来代替类B的实例。
注解方式
@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询的结果不止一个,那么@Autowired会根据变量的名称来查找。
POM文件是Maven项目的配置文件,它用XML格式描述了项目的基本信息、依赖关系、构建设置、报告生成等内容。POM文件通常放在项目的根目录下,命名为pom.xml。POM文件的结构由一个project元素和若干子元素组成,其中最重要的三个子元素是groupId, artifactId和version,它们组成了Maven坐标,用来唯一标识一个项目或者一个构件。
POM文件中还可以定义一些其他的子元素,例如:
- packaging: 项目的打包类型,如jar, war, ear等。
- dependencies: 项目所依赖的其他构件,可以指定依赖的范围、类型、可选性等属性。
- parent: 项目的父项目,可以继承父项目的一些配置信息。
- dependencyManagement: 项目的依赖管理,可以统一管理依赖的版本号等信息。
- modules: 项目的子模块,可以将一个大型项目拆分为多个子模块,方便管理和协作。
- properties: 项目的自定义属性,可以在POM文件中使用${name}引用。
- build: 项目的构建设置,包括插件、目标、资源等信息。
- reporting: 项目的报告生成设置,包括插件、输出目录等信息。
- name, description, url等: 项目的更多信息,用于描述项目的名称、简介、网址等内容。
- <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.0modelVersion>
-
-
- <groupId>com.examplegroupId>
- <artifactId>my-appartifactId>
- <version>1.0-SNAPSHOTversion>
-
-
- <packaging>jarpackaging>
-
-
- <name>My Appname>
- <description>A simple app for demonstrationdescription>
- <url>http://www.example.com/my-appurl>
-
-
- <parent>
- <groupId>com.examplegroupId>
- <artifactId>my-parentartifactId>
- <version>1.0version>
-
- <relativePath>../my-parent/pom.xmlrelativePath>
- parent>
-
-
- <properties>
-
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
-
- <junit.version>5.7.2junit.version>
- <log4j.version>2.14.1log4j.version>
- properties>
-
-
-
- <repositories>
-
- <repository>
- <id>centralid>
- <name>Maven Central Repositoryname>
- <url>https://repo.maven.apache.org/maven2/url>
-
-
-
-
- <releases>
- <enabled>trueenabled>
- <updatePolicy>neverupdatePolicy>
- <checksumPolicy>warnchecksumPolicy>
- releases>
- <snapshots>
- <enabled>falseenabled>
- <updatePolicy>neverupdatePolicy>
- <checksumPolicy>warnchecksumPolicy>
- snapshots>
- repository>
-
- repositories>
-
-
- <dependencies>
-
- <dependency>
- <groupId>org.junit.jupitergroupId>
- <artifactId>junit-jupiter-apiartifactId>
- <version>${junit.version}version>
- <scope>testscope>
- dependency>
-
- dependencies>
-
-
- <build>
-
- <finalName>my-app-1.0finalName>
-
-
-
- <plugins>
-
- <plugin>
- <groupId>org.apache.maven.pluginsgroupId>
- <artifactId>maven-compiler-pluginartifactId>
-
- <version>3.8.1version>
-
- <configuration>
-
-
-
-
- <encoding>UTF-8encoding>
- configuration>
- plugin>
- plugins>
- build>
- project>
Maven插件是一些用来执行特定任务的软件组件,它们可以在Maven的生命周期阶段中被调用,也可以直接通过命令行来执行。Maven插件的工作原理是,它们接收一些配置参数,然后根据这些参数来完成一些操作,如编译、打包、测试、部署等。Maven插件通常由一个或多个目标(goal)组成,每个目标都对应一个具体的功能。
Maven插件有两种类型:构建插件(build plugins)和报告插件(reporting plugins)。构建插件在构建过程中执行,并在pom.xml的
元素中配置 。报告插件在网站生成过程中执行,并在pom.xml的元素中配置。 Maven提供了很多内置的插件,如maven-compiler-plugin, maven-jar-plugin, maven-war-plugin等,它们分别用于编译Java源代码,打包JAR文件,打包WAR文件等。除了内置的插件,还有很多第三方提供的插件,如maven-shade-plugin, maven-checkstyle-plugin, maven-surefire-plugin等,它们分别用于创建Uber-JAR文件,检查代码风格,运行单元测试等
Spring Boot 是一个基于 Spring Framework 的项目,它可以让您更容易和更快地创建和运行简单或者基于 web 的应用程序。它是一个 Spring 模块,提供了 RAD (快速应用开发) 的特性。Spring Boot 可以根据您的类路径和配置的 bean,自动添加一些缺失的组件和设置。
- 内嵌Tomcat、Jetty或Undertow
- 采用Starter POM简化Maven的配置
- 提供产品级的运行监控功能
在POM文件中定义继承Spring-boot-starter-parent
- <parent>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-parentartifactId>
- <version>2.1.6.RELEASEversion>
- <relativePath/>
- parent>
在插件中采用SpringBoot的插件来编译打包应用
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- plugin>
- plugins>
- build>
@SpringBootApplication是一个复合注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfiguration
@ComponentScan
@interface
@Configuration 注解,实现配置文件的功能.
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }).
@ComponentScan:Spring组件扫描.
SpringBoot使用一个全局的配置文件application.properties或者application.yml(或者是yaml)
作用是修改SpringBoot自动配置的默认值;
Spring 的Actuator是一个用于监控和管理Spring Boot应用的模块,它提供了一系列的端点(endpoints),可以通过HTTP或JMX来访问。通过这些端点,我们可以获取应用的运行状态、健康状况、配置信息、性能指标、日志信息等。
Actuator的使用非常简单,只需要在pom.xml中添加spring-boot-starter-actuator依赖,就可以开启Actuator的功能。默认情况下,Actuator只会暴露两个端点:/actuator/health和/actuator/info,分别用于查看应用的健康情况和基本信息。如果要暴露更多的端点,需要在application.properties中进行配置。
RESTful API是一种遵循REST原则的应用程序接口,REST是一种软件架构风格,它定义了网络服务之间和客户端之间应该如何通信。RESTful API使用HTTP方法,如GET, POST, PUT, 和DELETE,来对资源进行操作,资源由统一资源标识符(URI)来标识。RESTful API还支持不同的数据交换格式,如JSON, XML, 或纯文本。RESTful API的目标是简单、可扩展、无状态、和统一的。
使用RESTful API的一些好处有:
- 它易于理解和实现,因为它使用了标准的HTTP协议和常见的数据格式。
- 它灵活和可扩展,因为它允许开发者根据自己的需求选择最合适的工具和技术。
- 它互操作和兼容,因为它可以与任何支持HTTP和数据格式的系统通信。
- 它高性能和可靠,因为它可以利用HTTP的特性,如缓存、压缩、和并发。
HTTP五种操作
Get请求
Post请求
Put请求
DELETE请求
Spring MVC是一个基于Java的Web框架,它遵循模型-视图-控制器(MVC)的设计模式。它实现了Spring框架的核心功能,如控制反转、依赖注入等。Spring MVC通过使用DispatcherServlet来优雅地实现MVC模式。DispatcherServlet是一个类,它接收来自客户端的请求,并将其转发给合适的处理器,如控制器、模型、视图等
Spring MVC中的Controller负责接收HTTP Request
- 交给View生成HTML页面 (传统的方式)
- 直接把数据写入到Http Response中(Restful)
RestFul Controller的注解
@RestController 是 Spring Framework 中用于创建 RESTful web services 的注解。它是一个方便的注解,将 @Controller 和 @ResponseBody 注解结合在一起,从而无需在控制器类的每个请求处理方法上使用 @ResponseBody 注解
@RestController
- 与@Controller标签相同,用于标注在类定义前面,使得类会被认定为Controller对象
- 用于告知Spring容器,该类所有方法的返回值需要以JSON格式写到Response的Body内。
javax.validation是一套JavaBean参数校验的标准,它定义了很多常用的校验注解1。这些注解可以直接加在JavaBean的属性上,以便在需要校验的时候进行校验2。在Spring Boot中,可以使用@Valid注解来启用参数校验1。如果您需要自定义校验注解,可以使用Hibernate Validator
跨源资源共享(CORS)是一种基于HTTP头的机制,它通过允许服务器标识除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源1。CORS机制允许Web应用服务器进行跨源访问控制,从而使跨源数据传输得以安全进行1。现代浏览器支持在API容器中(例如XMLHttpRequest或Fetch)使用CORS,以降低跨源HTTP请求所带来的风险,在Spring Boot中,可以使用addCorsMappings()方法来添加CORS映射
Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式。其中,bio(blocking I/O,阻塞式I/O操作)是表示Tomcat使用的是传统的Java I/O操作(即java.io包及其子包)
nio(non-blocking I/O,非阻塞式I/O操作)是一种基于缓冲区、并能提供非阻塞I/O操作的Java API,它拥有比传统I/O操作(BIO)更好的并发运行性能. 在Tomcat中,可以使用org.apache.coyote.http11.Http11NioProtocol协议来启用NIO模式