Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (Inversion of Control,控制反转) 和 AOP(Aspect Oriented Programming,面向切面编程)。
1.认识Spring:Spring是一个轻量级的DI(依赖注入)IOC(控制反转)/AOP面向切面的开源框架,来源yuRod johnson在器著作<>中阐述的部分思想和原型演变而来
2.Spring 提倡以"最少侵入"的方式来管理代码,这意味着,这是一个可以插拔的Spring
-
适用范围:适用于所有的java项目
-
目的:简化java开发
-
功能:使用基本的javabean代替EJB,并提供更多的应用功能
尽管 J2EE 能够赶上 Spring 的步伐,但 Spring 并没有停止前进, Spring 继续在其他领域发展,而 J2EE 则刚刚开始涉及这些领域,或者还没有完全开始在这些领域的创新。移动开发、社交 API 集成、NoSQL 数据库、云计算以及大数据都是 Spring 正在涉足和创新的领域。Spring 的前景依然会很美好。
Spring常用的术语: -
框架: 完成一定功能的半成品
框架能够帮助我们完成的是:项目的整体框架,一些基础功能:比如规定了类和对象的创建和协作.我们开发一个项目,最重要的就是要建立一个框架,然后在里面添加东西,测试后就可以上线了.
非入侵式设计:从框架的角度来说:无需继承框架的任何类,这样我们在更换框架的时候,之前的代码还可以继续使用,简单的理解是可以插拔性的.
量级:主要分为轻量级和重量级:轻量级一般指,非入侵的,依赖少,资源占用少,部署简单,重量级正好相反
javabean类:符合java规范的java类,简单的说就是依据数据库而建的java实体类
pojo类:plain old javaobject 简单老式的java类
它包含业务逻辑或者持久化逻辑,但不担当任何特殊角色且不继承或者不实现java框架的类或者接口
注意:bean 的各种名称——虽然 Spring 用 bean 或者 JavaBean 来表示应用组件,但并不意味着 Spring 组件必须遵循 JavaBean 规范,一个 Spring 组件可以是任意形式的 POJO。
容器:在日常生活中就是盛放东西的一种器具,从程序设计的角度 就是装对象的对象,由于存在放入和拿出的操作,所以要存储和管理对象,核心:存储什么就是什么,比如存储酒的就是酒瓶,装花的就是花瓶
Spring的优势: -
低侵入/低耦合(降低组件之间的耦合度,实现软件各层之间的解耦)
-
声明式事务管理(基于切面和惯例)
-
方便集成其他框架(mybatis,hibrenate)
-
降低java开发的难度
-
Spring框架包括了j2EE三层的每一层的解决方案(一站式)
Spring能帮我们做什么 -
Spring能根据配置文件创建及组装对象之间的依赖关系.
-
Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制
-
Spring能非常简单帮助我们管理数据库事务
-
Spring提供了与第三方数据库访问框架(如hibrenate,JPA )无缝集成,而且自己也提供了一套jdbc访问模板来方便数据库访问
-
Spring 还提供第三方web(struct1/2,JSF)框架无缝集成而且自己也提供了一套SpringMVC框架,来方便web层框架搭建.
-
Spring能方便的与java EE(java mail,任务调度)整合,与更多技术整合(比如缓存框架)
Spring框架结构图
Spring IoC(控制反转) 和DI(依赖注入)
IOC(inverse of control)是一种设计思想,将原本在程序中手动创建对象的控制权,交由Spring框架来管理 -
简单的说就是复杂的系统分成相互合作的对象,借助第三方来实现具有依赖之间的对象的解耦
-
正控:若要使用某个对象,自己去创建
-
反控:若要使用某个对象,直接从Spring容器中获取,不需要关心对象创建的过程,把对象的创建的权利,赋给了Spring容器,
-
好莱坞法则:Don’t call me I’ll call you
-
一个例子
控制反转显然是一个抽象的概念,我们举一个鲜明的例子来说明。
在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。
然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。
请注意你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。和面向对象的思想很相似
入门案例
- 导包:四个核心包,一个日志包,一个可选日志包
- 创建核心配置文件
- 定义实体类
- 核心配置文件中添加实体类配置
- 测试代码
创建容器对象:ClassPathXMLApplicationContext
容器中获取对象:getBean(“name属性值”)
bean类
测试类
配置文件
DI(dependency injection)
指Spring创建对象的过程,将对象的属性通过配置文件,配置设置给对象
1.底层通过setter方法设置
2.通过构造方法设置(注意在实体类设置有参的构造方法,构造方法里的参数和配置属性一一对应)
<!-- name 属性:构造函数参数名 -->
<!-- index 属性:构造函数参数索引 -->
<!-- type 属性:构造函数参数类型 -->
<!-- 上述三个属性不必全部出现,根据情况选择即可(都是确定构造参数的方式) -->
注意:属性有对象的时候用ref=“对象名”
复杂类型 array list set map
<bean name="collection" class="com.ujiuye.bean.Collection">
<property name="array">
<array>
<value>tom</value>
<value>jane</value>
<value>jack</value>
<value>jerry</value>
<ref bean="car"/>
</array>
</property>
<property name="list">
<list>
<value>一</value>
<value>二</value>
<value>三</value>
<value>四</value>
<ref bean="person"/>
</list>
</property>
<property name="map">
<map>
<entry key="1" value="老赵"></entry>
<entry key="2" value="老徐"></entry>
<entry key="1" value="老宋"></entry>
<entry key-ref="car" value-ref="car"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="fa">fa</prop>
<prop key="fs">fs</prop>
<prop key="fd">fd</prop>
</props>
</property>
</bean>
总结:传统的方式:是通过new关键字来创建对象
有了Spring后可以向spring容器获取对象 ,将创建对象的权利交给spring,降低对象依赖之间的耦合性,方便了后面的分层开发
IoC和DI的总结:实际上这两个是同一个概念的两种不同角度描述,DI相对IoC而言明确描述了被注入对象依赖IoC容器配置依赖对象
IoC是如何实现的? 如果我们自己做,该怎么做,
1.读取标注或者配置文件 ,根据实体类依赖那个source,拿到类名
2.使用反射的API,通过类名实例化对应的对象实例
3.将对象实例通setter或者构造传递给类 我们发现其实自己来实现也不是很难,Spring实际也就是这么做的。这么看的话其实IoC就是一个工厂模式的升级版!当然要做一个成熟的IoC框架,还是非常多细致的工作要做,Spring不仅提供了一个已经成为业界标准的Java IoC框架,还提供了更多强大的功能,所以大家就别去造轮子啦!希望了解IoC更多实现细节不妨通过学习Spring的源码来加深理解!
引用地址:IoC
SpringAOP AOP即 Aspect oriented program面向切面编程 在面向切面的编程思想里面,把功能分成核心业务功能和周边功能
-
核心业务:登录和增删改查
-
周边功能:性能统计,日志,事务管理
周边功能在Spring的面向切面编程AOP思想,即被定义为切面
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能"编制"在一起,这就叫AOP.
具体流程:将通知织入到被代理对象,返回代理对象的过程
AOP的目的
AOP能够将那些业务无关,却为业务模块所共同调用的逻辑或责任(例如事务管理,日志管 理,权限控制)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性.
AOP的概念 -
切入点(pointCut)在哪些类,哪些方法上切入(where)
-
通知(advice):在方法执行的什么实际(when:方法前/方法后/方法前后)做什么(what:增强的功能)
前置通知 before目标方法之前调用
后置通知 afterReturning(如果出现异常不会调用) 在目标方法运行之后
环绕通知 around 在目标方法之前和之后都调用
异常拦截通知 afterException 如果出现异常,就会调用
后置通知 after(无论是否出现异常都会调用) 在目标方法运行之后调用 -
切面(Aspect):切面 = 切入点+通知:通俗点就是讲:在什么时机,什么地点,做什么增强!
-
织入(weaving)把切面加入到对象,并创建出代理对象的过程.(由Spring完成)
AOP思想:面向切面,横向重复,纵向提取:应用该思想的实例:过滤器,拦截器,监听器
SpringAOP实现原理:
jdk动态代理,必须使用接口
cglib代理:第三方代理技术,不需要使用接口,
spring可以实现对任何对象的代理(增强)
OOP思想:面向对象 万事万物皆对象
AOP编程步骤:
XML配置 -
导包
-
创建被代理对象
3.准备通知
4.XML中配置被代理对象
5.XML中配置通知
6.XML中将通知织入被代理对象
注解方式配置AOP
1.xml中开启注解配置
2.注解配置通知类
Spring管理事务
1.导包+命名空间(aop: context:)
2.java 代码中引用Transaction Template模板对象通过接口回调
3.配置xml文件
事务管理器
模板
事务通知
aop:config
注解方式配置SpringAOP
Spring关于对事务管理的API
platformTransactionManager:平台事务管理器
-
平台事务管理器:接口,是spring用于管理事务的真正的对象.
DataTransactionManager:底层使用JDBC管理事务
org.springframework.jdbc.datasource.DataSourceTransactionManager
HibernateTransactionManager :底层使用Hibernate管理事务
事务模板对象TransactionTemplate
org.springframework.transaction.support.TransactionTemplate -
TransactionDefintion:事务定义信息
事务定义:用于定义事务的相关信息:隔离级别,超时信息,是否只读,传播行为 -
transactionStatus:事务的状态
事务状态:用于记录事务管理过程中的,事务状态的对象 -
事务管理的API的关系:
Spring进行事务管理的时候,首先,平台事务管理器根据事务定义信息进行事务的管理,在事务管理的过程中,产生各种状态,将这些状态信息记录到事务状态的对象中.
Spring事务的传播行为:
Spring提供了七种事务的传播行为
- 保证多个操作在同一个事务中
1. PROPAGATION_REQUIRED :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
2. PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
3. PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。 - 保证多个操作不在同一个事务中
PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
PROPAGATION_NEVER :如果A中有事务,报异常。 - 嵌套式事务
PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。
注:本次编辑来此https://www.cnblogs.com/wmyskxz/p/8820371.html及自己所学,若有雷同部分,请见谅,可以联系本人:xiao_xiao3601
欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
新的改变
我们对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文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎