Spring
简介
1、基本概念
1.1、SpringSpring是一个开源框架,
Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。(**spring:是连接springmvc和mybatis的关键,主要作用是用于创建对象(ioc)、注入对象(di)。一般情况下,项目里面主要用到的各种对象都由spring来创建和管理**)
1.2 在Spring中,
一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring提供的IoC容器。Spring是基于Bean的编程。并且,Spring技术并不是为了代替任何技术,而是将所有的技术整合起来。
Spring核心IoC控制反转。
“我”,充当主动角色,我喝水的时候,需要杯子,于是我new一个杯子来用。至始至终都是以“我”为中心。这就是控制“正”转。 控制反转,就是把杯子交给容器来管理,当“我”需要杯子的时候,去请求Spring给“我”一个杯子,“我”不再是控制方,而是请求者。控制权在容器手里,“我”依赖容器的资源。 资源交给“我”的过程,就是依赖注入。
假如入口类“我”是一家公司,“我”去找员工&员工提交简历给我,哪个对我有利?不要我去new,而是对象向IOC容器递交简历,我需要什么资源,IOC再交给我。
有没有一丝第三方劳务派遣的味道?主要是为了降低“我”的开销。直观来说,我们不需要频繁地new对象了,Spring会读取配置文件把所有的类都放在容器中,需要的时候直接送上。
控制反转是一种通过描述(xml配置或者注解),再通过第三方去产生或者获取对象的方式。而对象内部依赖的复杂性也无需我们去考虑,容器给你提供的对象,必然是可用的。
1.2、SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。(springmvc:是mvc设计模式的一种实现,主要负责前端页面的控制,包括数据的渲染、页面的跳转)
根据我们对Servlet的了解,DispatcherServelt会拦截HTTP发过来的请求,在init阶段获取配置信息,得到统一的资源标识符(URL)和处理器(Handler)之间的映射关系。
为了灵活和功能增强,SpringMVC还增加了拦截器,可以在处理器执行前后加入自己的代码,这样就构成了处理器执行链条。
处理完毕后,根据上下文视图解析器定位视图,将数据模型渲染到视图中,最终完成对用户请求的响应。
SpringMVC的优势在于:模型层被拆分为业务层(Service)和数据访问层(Dao),在Service下我们可以通过Spring的声明事物操作数据库访问层,在Service中还允许我们访问NoSql。SpringMVC结构松散,在SpringMVC中可以使用JSON、JSP、XML、PDF等等就,满足平板、手机,页面的各类请求。
1.3、MyBatisMyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。(数据持久层框架,主要作用是从数据库里查询出数据然后将数据转换成对应的实体类。数据持久层的方便之处就在于不需要我们自己将jdbc查询出来的resultset一个一个映射成对应的实体类对象。)
Mybatis的优点显而易见:
不屏蔽SQL,可以精确地定位SQL语句,也可以对Sql进行优化和改造,有利于互联网开发对性能的要求。强大灵活的映射机制,提供动态SQL的功能,允许SQL组装,可读性可维护性好。
提供Mapper接口编程,只要一个接口和XML就能创建映射器,几乎省略了所有的JDBC代码,诸多框架API在Mybatis中消失,开发者集中精力在业务逻辑上。
2. Spring
2.1 控制反转
我不写定义,就说一下你的电脑。你的电脑上有usb口吧,有hdmi口吧。电脑上用什么键盘,不取决于电脑本身,而是插在usb上的键盘是什么?这个能理解吧。你看控制电脑用什么输入的设备并不是由电脑控制的,而是你插入的键盘是什么来控制的。这个控制不就反了吗?
2.2 依赖注入
就是控制反转。电脑的输入设备依赖它被插入的是什么键盘。插入机械键盘,输入设备就是机械键盘,插入数字键盘就只能输入数字。从插键盘这个事来说:无非是从电脑角度看,是依赖注入,输入设备是什么依赖注入的键盘是什么;从键盘角度看是控制反转,插入的键盘来控制电脑是什么输入设备。为什么要用依赖注入?目的就是可以灵活搭配。如果你的电脑上的键盘是焊死在电脑上的,键盘坏了,你的电脑也废了。你肯定不想这样吧。Java开发中,我们需要创建大量的对象,有些重要的对象牵一发而动全身,这样的对象我们可以交给Spring帮我们来创建,我们只需要提供配置文件,这个配置文件可以是xml,也可以是java本身。好比Spring是个工厂,按图纸就可以做出产品。
2.3 AOP
什么是切面?你可以这样想:一个公司有多个销售部,都需要行政帮忙搞定日常的订文具、机票、办公室、出差酒店什么的,都需要财务搞定报销、收付款什么的事务吧,要仓库帮忙发货什么的。不可能每个销售部都去招几个行政、财务和仓管什么吧,销售部门只要做好业务就行了,订文具什么的事情交个专门的部门去办就行。在Spring AOP 中,把这些公共的事务,也就是这个例子中的行政啊、财务啊、仓管啊,看成一个个切面,让你的开发的时候,专注于核心业务。
2.4 事务
说个例子:比如我支付宝转给你100块钱,正常操作应该是我的账号里少了100,你的多了100。如果由于各种原因,我少100后,系统出问题了。没有事务的话,你的账号不会多100,而我的账号少了100。这个就是有问题了。有事务的话:要不我少100你多100都成功,要不就都不成功,这样钱才不会少。而手写一个事务还是有点小难度的,Spring的事务(spring-tx)可以帮我们轻松实现。
3 Spring MVC
这个的话,你要先理解一下MVC是什么?
C - Controller:控制器。接受用户请求,调用 Model 处理,然后选择合适的View给客户。
M - Model:模型。业务处理模型,接受Controller的调遣,处理业务,处理数据。
V - View:视图。返回给客户看的结果。注意这里的客户未必是人,可能是浏览器,可能是APP。
这样想必你不明白,举例:你去饭店吃饭,坐下来后,服务员小妹来找你点菜。你点了个宫保鸡丁,小妹就拿着你的点菜单都后厨。后厨的师傅打开食物储藏柜,找到鸡丁,开炉子,放油,一顿爆炒,装盘。小妹端起盘子回到你的桌子。当然,如果小妹觉得你帅,说不定还会偷偷加个鸡腿给你;如果你碰巧是当年甩了小妹的前男友,说不定小妹会吐口口水在里面。这里,你就是客户,你点菜就是发出请求(Request),小妹就是Controller,后厨就是 Model,小妹最后给的盘子及里面的内容就是View,小妹给你盘子就是响应(Respond)。Controller处理客户请求,反馈给Model。Model处理,返回数据(宫保鸡丁)给Controller(小妹)。小妹可以直接给你,也可以给你加鸡腿或吐口水后给你。最终,你得到了一盘吃的(View)。Spring MVC就是个MVC框架,和Spring天生就集成。
4. MyBatis
一个帮你和数据库打交道的框架。帮你把数据库的表翻译成类,字段翻译成类的字段,记录翻译成对象。(当然这些全要靠你自己定义。)这样做的后果就是,你可以像写java一样操作数据库了。什么打开JDBC,防止sql注入,不用考虑,MyBatis帮你搞定。Spring中,通过简单的设置就可以集成MyBatis这个框架,所以会有SSM框架的说法。
作者:Martin Wang
链接:https://www.zhihu.com/question/328810338/answer/720393487
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
容器初始化
- 启动容器时需要自动装载 ApplicationContext,Spring 提供的 ContextLoaderListener 就是为了自动装配 ApplicationContext 的配置信息
- 在WEB.XML里面配置项目的入口,不再是main方法了。
- 在pom.xml里面添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
4.在web.xml下面添加配置内容
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context*.xml</param-value>
</context-param>
它就会自己去class下面的spring-context配置文件,自动去加载使用;
基于注解的装配方式-bean
对于 DI 使用注解,将不再需要在 Spring 配置文件中声明 Bean 实例。Spring 中使用注解, 需要在原有 Spring 运行环境基础上再做一些改变
- 需要在 Spring 配置文件中配置组件扫描器,用于在指定的基本包中扫描注解
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">
<context:annotation-config />
<context:component-scan base-package="com.funtl.leeshop"/>
</beans>
- @Component
需要在类上使用注解 @Component,该注解的 value 属性用于指定该 bean 的 id 值。
@Component(value = "student")
public class Student {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
- Spring 还提供了 3 个功能基本和 @Component 等效的注解:
@Repository:用于对 DAO 实现类进行注解
@Service:用于对 Service 实现类进行注解
@Controller:用于对 Controller 实现类进行注解
@Scope
需要在类上使用注解 @Scope,其 value 属性用于指定作用域。默认为 singleton。
@Value
需要在属性上使用注解 @Value,该注解的 value 属性用于指定要注入的值。
@Autowired
需要在域属性上使用注解 @Autowired,该注解默认使用 按类型自动装配 Bean 的方式。
使用该注解完成属性注入时,类中无需 setter。当然,若属性有 setter,则也可将其加到 setter 上。
@Resource
需要在域属性上使用注解 @Resource,该注解有一个 name 属性,可以创建指定的 bean
@PostConstruc
在方法上使用 @PostConstruct 相当于初始化
新的改变
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
功能快捷键
撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G
合理的创建标题,有助于目录的生成
直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC
语法后生成一个完美的目录。
如何改变文本的样式
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
插入链接与图片
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
如何插入一段漂亮的代码片
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// An highlighted block
var foo = 'bar';
生成一个适合你的列表
- 项目
- 项目
- 项目
- 项目
- 项目1
- 项目2
- 项目3
- 计划任务
- 完成任务
创建一个表格
一个简单的表格是这么创建的:
项目 | Value |
---|---|
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' | ‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" | “Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash | – is en-dash, — is em-dash |
创建一个自定义列表
-
Markdown
- Text-to- HTML conversion tool Authors
- John
- Luke
如何创建一个注脚
一个具有注脚的文本。2
注释也是必不可少的
Markdown将文本转换为 HTML。
KaTeX数学公式
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎