Spring

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

  • 一个例子
    控制反转显然是一个抽象的概念,我们举一个鲜明的例子来说明。

在现实生活中,人们要用到一样东西的时候,第一反应就是去找到这件东西,比如想喝新鲜橙汁,在没有饮品店的日子里,最直观的做法就是:买果汁机、买橙子,然后准备开水。值得注意的是:这些都是你自己“主动”创造的过程,也就是说一杯橙汁需要你自己创造。
在这里插入图片描述

然而到了今时今日,由于饮品店的盛行,当我们想喝橙汁时,第一想法就转换成了找到饮品店的联系方式,通过电话等渠道描述你的需要、地址、联系方式等,下订单等待,过一会儿就会有人送来橙汁了。
在这里插入图片描述

请注意你并没有“主动”去创造橙汁,橙汁是由饮品店创造的,而不是你,然而也完全达到了你的要求,甚至比你创造的要好上那么一些。和面向对象的思想很相似

入门案例

  1. 导包:四个核心包,一个日志包,一个可选日志包
  2. 创建核心配置文件
  3. 定义实体类
  4. 核心配置文件中添加实体类配置
  5. 测试代码
    创建容器对象: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编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销: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.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
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)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值