文章目录
前言
本博客仅做学习笔记,如有侵权,联系后即刻更改
科普:
相关概念
JavaEE
- 对JavaSE的扩展
加入了面向企业开发(网络和Web开发)的支持
包括Servlet,WebSocket,EL,EJB
- 和JavaSE比
更多jar包,以javax开头
javax.servlet,javax.websocket
Servlet和Container
- Servlet
Servlet 是一套用于处理 HTTP 请求的 API 标准
- Container
JavaEE只提供了Servlet的标准
真正运行servlet,需要Container
EJB和Spring框架
- EJB( Enterprise JavaBean)
JavaEE的一个组件,面对更复杂的企业业务开发(可选)
- Spring框架
可视为EJB的替代品
包括很多web开发工具
- SpringMVC,SpringBoot 以及 SpringCloud等
JavaEE开发
相关框架
仅通过Servlet和JSP技术也可以开发
SSH三大web开发框架
Struts,Spring,Hibernate
SpringMVC
初步实现
MVC是什么?
一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)
- Servlet配置
对外提供了一个名为 DispatcherServlet 的类
- 相当于是 SpringMVC 和 Servlet API 的一个交界点
- SpringMVC 当中对于请求处理的一个分发器
- Controller实现
实现网络收发请求 - SpringMVC配置
将Controller加入beans列表
相关概念
- Annotation(注解)
对源代码的一种标注
常见注解举例
- @Override
重写- @Deprecated
标识为废弃代码- @Target
指明这个注解可以用在哪些语言元素上,例如方法,类型,函数参数等。- @Retention:指明注解的存储方式,默认的存储方式是 CLASS
SOURCE(只存在于代码中,编译完成后被丢弃)
CLASS(存储在生成的 class 文件中,但是会被 VM 在运行期丢弃)
RUNTIME(存储在 class 文件中,并且 VM 在运行期间也会保留,因此可以使用反射获得)- @Documented
指明使用了这个注解的代码,其生成的 Javadoc 中会把此注解展示出来- @Inherited
它标记对于父类的注解,会被子类做继承,默认行为是不继承。
- JavaBean
编写数据 Model 时的一种编程惯例
实现要求
- 有无参的构造器
- 所有的成员都是 private,对外暴露 getter 和 setter
- 实现 Serializable
Spring 把很多东西包括自己的一些组件也都称为 Bean,是对 JavaBean 的进一步泛化
工作流程
配置SpringMVC的Controller
在 Controller 类中
- 对于请求的分发处理,@RequestMapping 的作用很明显
- 在初始化 Controller 的时候,SpringMVC 把 @RequestMapping 注解当中的信息进行处理
之后就可以根据这些信息,把请求分发到对应的 Controller 当中的对应方法里
- @ResponseBody 表明函数的返回值应该被用作 HTTP 返回的 body 处理
SpringMVC 用我们返回的字符串生成 HTTP 响应,返回给了客户端。
Spring loC
Spring最基础部分是 loC Container,也是Spring MVC的基础
相关概念
- loC:控制反转
面对对象编程的一种设计原则,降低计算机代码的耦合度
实现方式:依赖注入和依赖查找
依赖注入
- 基于接口
实现特定接口以供外部容器注入所依赖类型的对象- 基于set方法
实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象- 基于构造函数
实现特定参数的构造函数,在新建对象时传入所依赖类型的对象- 基于注解
在私有变量前加“@Autowired”等注解
- 相当于定义了public的set方法,但是因为没有真正的set方法
从而不会为了实现依赖注入导致暴露了不该暴露的接口
因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问依赖查找
- 通过调用框架提供的方法来获取对象
获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态
- Context、Bean
loC Container:被称为Context
- 主要工作就是使用对象的定义,加上 Configuration,生成 Bean
代码上体现为 ApplicationContext 接口- Container 依赖于 Configuration metadata(配置元数据)去初始化对象
Bean
- 由 Container 管理的对象
相关配置修改
Spring Bean
- 对象依赖
依赖注入
- Constructor 注入
- Setter 注入
- Annotation-Based 配置
本质上 @Autowired 就是把原先在 XML 中对于对象的引用配置,转移到了 Java 代码当中
- 直接在代码中创建出 Bean
被称为Component-Scan
- 修改 XML 配置,打开 Component-Scan 功能
- 使用@Service 和 @Component 标示逻辑和服务层的组件,使用 @Repository 标示持久层的组件
Spring 中定义了若干用于注册 Bean 的 Annotation
component-scan 也就是告诉 Spring 去扫描标示了这些 Annotation 的类,将它们用于 Bean 的注册
Java-Config
彻底去掉对于 XML 文件的依赖,完全使用 Java 代码进行配置
- 创建一个配置类
@Configuration 是指示该类为 Bean 配置的源头
- 修改我们使用的 Context
使用 AnnotationConfigApplicationContext 代替了之前的 ClassPathXmlApplicationContext
然后把 AppConfig.class 作为参数传给了 Context
XML文件 和 Bean 的配置方法比较
- XML文件配置
优点
- 使用 XML 的好处在于更新 Bean 之后不需要重新编译代码
- 同时有利于将若干 Bean 组织在一个文件里,方便集中管理
缺点
- 在于 XML 语法的“噪声”太大,没有工具帮助的情况下书写很繁琐
- 同时 XML 本身没有很好的类型检查和语法检查机制,使得 XML 也很容易写错
- 使用代码配置
好处
- 在于更加简洁清晰,同时不容易出错
缺点
- 在于 Bean 的配置会分散在各个文件当中,以及需要重新编译代码才能更新配置。
Bean
创建是完全由 Spring Container 进行控制的
生命周期和作用域
Bean 在 Container 的控制下,有自己的生命周期和作用域
- 默认的作用域是 Singleton
在 Container 内该 Bean 只会被创建一次,后续的所有对于该 Bean 的请求都会返回同一个对象- Prototype
每次对于 Bean 的请求,都会创建一个新的对象
Lifecycle Callback
Spring 允许 Bean 在创建和销毁的时候注册回调:
initMethod、destroyMethod
同类名Bean处理
使用 @Primary
- 有多个 candidate 可以选择的时候,Spring 会使用标注了 @Primary 的
@Qualifier
- 需要用到 Person 的地方进行标记:@Qualifier(“id”)
Servlet3
Servlet API 从 3.0 也支持基于 Annotation 的配置
- 继承 ServletContainerInitializer 来实现替代 web.xml 的作用
- 要求在 deploy 目录中加入
META-INF/services/javax.servlet.ServletContainerInitializer 文件
来指示 ServletContainerInitializer 的实现者,用于 Servlet 的初始化- SpringMVC 已经完成了这件事情
通过接口WebApplicationInitializer,可以进行类似 web.xml 的配置
注意这一层封装,实际上是想把 Servlet API 和 Spring API 隔离开
纯 Java SpringMVC 配置
- 使用 AnnotationConfigWebApplicationContext 去初始化 DispatcherServlet
- 修改 AppConfig
进一步简化 Java 配置的过程,Spring 还提供了一个名为 AbstractAnnotationConfigDispatcherServletInitializer 的类
Maven
构建和包管理:Java生态系统的重要组成部分,以Gradle 和 Maven 两大工具为主
定义
Java 构建工具,包含了依赖管理,版本维护,自动化构建等功能
@RestController
实际上就是在 @Controller 的基础上,给所有的函数返回值增加了 @ResponseBody
- Spring 本身是不带 JSON 功能的,通过 Maven 引入一个很常用的 JSON 库 Jackson
@EnableWebMvc 会帮我们配置好 JSON 有关的响应 Handler。如果没有,是不能返回 JSON 响应的
SpringBoot
构建在 SpringMVC 基础上的新一代 Web 开发框架
优越性
- @SpringBootApplication 这个 Annotation
它会帮我们打开 @EnableWebMvc,以及 @ComponentScan 功能,自动配置 - 继承 SpringBootServletInitializer
整个应用就具备了部署到 Servlet Container 的能力
"${...}" 写法
是 Spring 独有的 SpEL(Spring Expression Language)语法,等同于 JSP 的 EL 表达式
配置外部化
通过外部环境(文件)来进行配置
将配置和代码隔离开来,有助于降低配置的耦合性
@ConditionalOnBean(name = “dataSource”)
这样配置,当已经存在一个名为 dataSource 的 Bean 时,thisBean 才会生效
- 还有 @ConditionalOnMissingBean,@ConditionalOnClass的自动配置可以实现
Spring Data REST
简化 REST 服务的开发
ORM:对象关系映射
是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的资料之间的转换
创建了一个可在编程语言里使用的“虚拟对象数据库
ORM相当于中继资料
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的
而关系数据库则是从数学理论发展而来的
相关概念
- JPA
Sun 官方提出的一套 Java 持久化规范,也可以简单理解为 ORM 的规范
- Hibernate
Java 持久化框架,它实现了 JPA 规范,可以被用作 JPA Provider
- Spring Data JPA
Spring 的 JPA 组件
它提供了将 JPA 融入 Spring 框架的支持,它默认使用 Hibernate 作为 JPA Provider
总结
小小励志
有些事你现在不做,一辈子都不会做了。
如果你想做一件事,全世界都会为你让路。
《搭车去柏林》