文章目录
Maven
概述
Maven 是服务于 Java 平台的项目构建和依赖管理的自动化构建工具。其作用是改进项目的开发和管理。
- 管理 jar 文件
- 自动下载 jar 文件及其文档、源代码
- 管理 jar 文件之间的依赖
- 编译程序,将 .java 编译成 .class
- 测试代码是否正确
- 打包文件,形成 jar 文件或者 war 文件
- 部署项目
提问
-
为什么要用 Maven 构建项目?
如果不使用 Maven ,写完代码后还需要进行编译、生成 war 包,以便部署到 Tomcat。
在编写 Java 代码时,我们需要调用 JDK 的 API 、第三方的 API 。假如没有构建工具,那程序员就需要把 jar 包下载到本地、添加进工程、在 IDEA中进行添加配置。这种方式过于繁琐,并且在遇到版本升级、Git 同步等时候,程序会变得非常脆弱、易产生未知错误。
因此,有了构建工具的产生,它可以让我们专注于写代码而不需要考虑如何导 jar 包、如何升级 jar 包、以及 Git 多人协作等等问题。
以上是在编译过程中的优势,在运行和发布的过程中,构建工具依然可以帮助我们将工程生成指定格式的文件。
第一,Maven 是一个优秀的项目构建工具,使用 Maven 可以很方便的对项目进行分模块构建,这样的话在开发与测试打包部署时,效率会提高很多。
第二,Maven 可以进行依赖的管理,将不同系统的依赖进行统一管理,并且可以进行依赖之间的传递与继承。
-
Maven 规约是什么?
/src/main/java/
:Java 源码。/src/main/resource
:Java 配置文件,资源文件。/src/test/java/
:Java 测试代码。/src/test/resource
:Java 测试配置文件,资源文件。/target
:文件编译过程中生成的.class
文件、jar、war 等等。pom.xml
:必须有,配置文件,Maven 的核心文件Maven 主要负责项目的自动化构建。以编译为例,Maven 要想自动完成编译,那么它必须知道 Java 的源文件保存在哪里,有了以上的约定之后,程序员就不用手动地去指定位置了,Maven 能够自动获取位置从而帮我们完成自动编译。
遵守**约定 > 配置 > 编码 > **,即能进行配置的就不要用编码指定,能事先约定规则的就不要进行配置。
-
Maven 常用命令
mvn eclipse:clean
:清除 Project 中以前编译的东西,重新再来mvn eclipse:eclipse
:开始编译 Maven 的 Projectmvn clean package
:清除以前的包后重新打包mvn archetype:create
:创建 Maven 项目mvn compile
:编译源代码mvn deploy
:发布项目mvn test-compile
:编译测试源代码mvn test
:运行应用程序中的单元测试mvn site
:生成项目相关信息的网站mvn clean
:清除项目目录中的生成结果mvn package
:根据项目生成的 jar/war 等mvn install
:在本地 Repository 中安装 jarmvn eclipse:eclipse
:生成 Eclipse 项目文件mvn jetty:run
:启动 Jetty 服务mvn tomcat:run
:启动 Tomcat 服务mvn clean package -Dmaven.test.skip=true
:清除以前的包后重新打包,跳过测试类 -
Maven 优缺点
- 优点:简化项目依赖管理;易于上手;便于与持续集成工具整合;便于项目升级;有助于多模块项目的开发(一个项目开发好后发布到仓库,以来该模块时就可以直接从仓库中更新,而不用自己手动编译);Maven 有很多插件,便于功能扩展(生产站点、自动发布版本)。
- 缺点:Maven 是一个庞大的构建系统,学习难度大;Maven 采用约定大于配置的策略,一旦出错,难于调试;依赖很多时,Eclipse 会很卡,使用 IDEA 就可解决;我国网络环境不允许 Maven 访问某些仓库(Google Code、JBoss等),这个问题可以在 <mirror> 中增加阿里巴巴的 Maven 私服进行解决。
Spring Boot
概述
Spring Boot 是简化 Spring 应用开发的一个框架,是整个 Spring 技术栈的大整合,约定大于配置,去繁化简。
用来简化 Spring 应用的初始搭建以及开发过程,使用特定的方式来进行配置;创建独立的 Spring 引用程序 main 方法运行;嵌入的 Tomcat 无需部署 war 文件;简化 Maven 配置;自动配置 Spring 添加对应的功能 。
优点
- 独立运行:Spring Boot 内嵌了各种 Servlet 容器(Tomcat、Jetty 等),不再需要打成 war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。
- 简化配置:spring-boot-starter-web 启动器自动依赖其他组件,减少了 maven 配置。
- 自动配置:Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring-boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。
- 无代码生成和无 XML 配置:Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的。
- 避免大量的 Maven 导入和各种版本冲突。
- 应用监控:Spring Boot 提供一系列端点可以监控服务及应用,做健康检测。
核心注解
启动类上 @SpringBootApplication 是 Spring Boot 的核心注解。
主要组合包含了以下3个注解:
@SpringBootConfiguration:组合 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项(如关闭数据源自动配置功能:@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})。
@ComponentScan:Spring 组件扫描。
自动配置原理
- Spring Boot 启动会加载大量的自动配置类;
- 首先看程序需要的功能有没有在 Spring Boot 默认写好的自动配置类中;
- 再看这个自动配置类中到底配置了哪些组件,只要我们需要用到的组件存在其中,就不需要再手动配置了;
- 给容器中自动配置类添加组件时,会从 properties 类中获取某些属性,我们只需要在配置文件中指定这些属性的值即可。
启动过程
- 从类路径下的 META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值;
- 将这些值作为自动配置类导入容器,自动配置类就生效,进行自动配置工作;
- 整个 J2EE 的整体解决方案和自动配置都在 springboot-autoconfigure 的 jar 包中;
- 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
- 有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
Spring Boot VS Spring MVC VS Spring
- Spring:最重要的特征是依赖注入 DI,所有的 Spring Modules 不是依赖注入 DI 就是 IOC 控制反转,好处是开发出松耦合应用。
- Spring MVC:提供一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServlet、ModelAndView、ViewResolver 等一些简单的概念,开发 Web 应用将会变得非常简单。
- Spring Boot:Spring 和 Spring MVC 的问题在于需要配置大量的参数。Spring Boot 通过一个自动配置和启动的项来解决这个问题。
Spring Boot VS Spring Cloud
- Spring Boot:是一个快速开发框架,通过用 Maven 依赖的继承方式,帮助快速整合第三方常用框架,完全采用注解化(使用注解方式启动 Spring MVC ),简化 XML 配置,内置 HTTP 服务器(Tomcat,Jetty),最终以 Java应用程序进行执行。
- Spring Cloud:是目前一套完整的微服务框架,它是一系列框架的有序集合。将目前各家公司比较成熟的服务框架组合起来,通过 Spring Boot 风格进行再封装,屏蔽掉复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署、易维护的分布式系统开发工具包。它利用 Spring Boot 的开发便利性,简化了分布式系统基础设施的开发。
- Spring Boot 可以离开 Spring Cloud 单独使用,而Spring Cloud 离不开 Spring Boot。
微服务
概念
微服务是一种架构模式(架构风格),提倡单一应用程序划分为一组小的服务,每个服务在其独立的进程中,服务之间相互协调、互相配合,为用户提供最终价值。
服务之间采用轻量级的通信机制互相沟通(基于 Http 的 Restful API),每个服务都围绕着具体的业务进行构建,并且能够被独立地部署到生产环境,类生产环境进行构建。可以有一个非常轻量级的集中式管理来协调这些服务,可以使用不同的语言来编写服务,也可以使用不同的数据存储。
优点
- 每个服务足够内聚,足够小,代码容易理解,开发简单、效率提高,能聚焦一个指定的业务功能或业务需求;
- 松耦合,开发阶段与部署阶段都是独立的;
- 能使用不同的语言开发;
- 允许容易且灵活的方式集成自动部署,易于和第三方集成;
- 仅仅是业务逻辑的代码,不会和 HTML、CSS 或其他界面组件混合;
- 每个微服务都有自己的存储能力,可以有自己的或者统一的数据库。
缺点
- 开发人员要处理分布式系统的复杂性;
- 多服务运维难度随服务的增加而增大,系统集成测试;
- 系统部署依赖、数据一致性、性能监控
- 服务间通信成本
微服务中如何实现 session 共享
在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了。
但是,我们经常需要在不同微服务之间共享 session,常见的方案就是 Spring Session + Redis 来实现 session 共享。将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session ,这样就实现了 session 共享。
Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便。
提问
-
Spring Boot 是微服务框架吗?
不是,它仅仅是一个用来快速开发地框架,底层还是 SSM 。
Spring Cloud 实现微服务开发:Spring Cloud 具备微服务开发的核心技术(RPC 远程调用技术),Spring Cloud 底层使用了 Spring Boot,Spring Boot 的 web 组件默认集成了 Spring MVC ,可以实现 HTTP + JSON 的轻量级传输,编写微服务接口,所以 Spring Cloud 依赖 Spring Boot 框架实现微服务开发。