Spring 考前复习

Spring 框架优势三大点:

1.IOC 轻量级容器/控制翻转,又名DI/依赖注入。
2.Transaction 事务管理。
3.AOP 面向切面编程。

(1)、依赖注入有三种实现方法:

     ①、set注入。
     ②、构造器注入。
     ③、注解注入。

(2)、AOP:面向切面:
一个程序中跨多个点的功能被称为横切关注点。这些横切关注点在概 念上独立于应用程序的业务逻辑,有各种各样常见的很好的关于方面的例子:如日志记录声明性事物、安全性和缓存等。在OOP中,模块化的关键单元是类。而在AOP中,模块化的关键单元是切面。AOP帮助你将横切关注点从他门所印象的对象中分离出来,然而,依赖注入帮助你将的应用程序对象从彼此分离出来。Spring框架的AOP模块提供了面向切面的程序设计实现,允许你定义拦截器方法和切入点。可以实现将你应该被分开的代码干净的分开功能。
JDBC:提供数据库连接操作。
ORM:提供对象关系映射处理。
事物:提供编程式和声明式事物管理。
WEB模块:提供了基本的面向web的集成功能。
WEB-MVC模块:包含Spring的模块。

Spring 容器

概念:spring容器是spring框架的核心,使用依赖注入来管理成一个应用程序的组件。通过阅读配置元数据配置的指令,容器知道对哪些进行实例化,配置和组装,配置元数据可以用过XML、Java注解或Java代码来表示。

bean的属性及作用域

bean的基本属性:

  1. class:是强制性的,用来创建指定bean的bean类。
  2. Name:用来指定标识符。
  3. scope:是特定的bean定义创建对象的作用域。
  4. id:唯一性。
    作用域:
  5. Singleton:单例,只会产生同一对象。
  6. prototype:多例,就是每次访问都会访问到不同的对象数据。

bean的声命周期

概述:当一个bean被实例化时,他可能需要执行一些初始化使他转换成可用状态。同样,当bean不再需要并且从容器中移除时,可能需要做一些清除工作,转换过程。
声命周期体现的方式:

  • 代码方式。
  • XML配置文件 ——更灵活方便。
    功能实现:
    在bean设值注入之后添加处理代码:A为java代码实现B为XML文件实现。
    A、让bean实现InitializingBean。
    B、直接用init-method 指定方法。
    在bean销毁之前:
    A、让bean实现DisposableBean。
    B、用destroy-method 指定销毁前的方法。

补充:当定义一个bean时,如果用abstract=“true”属性的话则表明bean自身不能实例化,仅仅只是作为模板bean定义使用,充当子定义的父定义使用。

依赖注入

  1. set注入:普通方法继承 bean下porperty标签指定。
  2. 构造器注入:方法有构造方法 beanconstructor-arg标签。
  3. 注解注入:方法有很多 下节描述。

Spring自动装配-autowire

概念:有助于减少编写xml配置数量,由于大型项目xml配置数量较多,可以代替类类之间ref的连接。
实现自动装配,在bean中定义声明autowire来启动自动装配。

模式名称描述
No没有开启
byName根据名字来匹配连接
byType由属性类型匹配
construclor类似于byName
autodetect先通过construclor再byType执行

自动装配局限性:

  1. 重写的可能性:可以使用重写制动装配的< constructor-arg>和property设置未指定依赖关系。
  2. 原始数据类型:不能自动装配所谓的简单类型包括基本类型。
  3. 混乱的本质:自动装配不如显示装配精准,所以如果可能的话尽量使用显示装配。

Spring 事件

概述:以往是使用application改容器管理bean的生命周期,当容器加载管理bean时会随着一系列的事件发生和处理。如:启动停止监听。

关键词
contextStartedEvent容器启动
contextStoppedEvend容器停止
applicationEvent容器事件
applicationListener容器事件监听
事件名描述
contextReffreshedEvent事件初始化或刷新时,该事件被发布
contextStartedEvent启动
contextStoppdeEvent停止
contextClosedEcent关闭
RequestHandledEvent这是一个web-specific事件,告诉所有bean HTTP请求已经被服务

Spring AOP 面向切面

概述:Aop是spring的一个关键组件,面向切面的编程需要把程序逻辑关系解成不同的部分,所谓的关键的,跨一个应用程序的多个点被称为横切关注点。在概念上独立于应用程序的逻辑,比如:日志记录、审计、声明式等。在OOP中,关键模块度是类,而AOP中是切面,依赖注入帮助你对应对象相互解耦,AOP可以帮助你从他门所影响的对象中对横切关注点解耦。
面向切面有两种方式:
一、横向:继承 使用aspect实现AOP方法。
二、纵向:切面 1、基于aspect的xml配置。2、注解方法。

AOP关键词粗略意思
Aspect需要被切面的类
Join point切入点
Advice切入后执行的方法
Pointcut通知被执行,可以用模式或指定切入点
Inteoduction应用允许你添加新方法或属性到现有的类中
Target object被一个或多个方面所通知的对象,永远是一个代理的,也被称为被通知对象
Weaving把方面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象

spring切面可使用的五种类型: 通知也可意为增强

类型解释
前置通知befo在一个方法前
后置通知afte在一个方法后通知,不考虑结果
返回后通知afterR~在一个方法执行后,只有在方法成功完成时才执行通知
抛出异常后通知aferT在一个方法执行后,只有在方法退出异常时才执行通知
环绕通知在建议方法调用之前后执行通知

注解实现:AOP
开启注解代理< aop:sp~-aut ~/>
@Aspect 开启;
@Pointcut() 切入点;
@前后切入(“切入点方法名加括号”);
@返回后 (pointcut=“切入方法”,retruning=“值”);
@异常 (pointcut=“切入方法”,throwing=“值”);

Spring 代理

**概述:**代理Proxy是一种设计模式,提供了对象目标另外的访问方式;即通过代理访问目标对象。这样的好处是可以在目标对象实现的基础上增强额外的功能。
代理模式的关键点:代理对象和目标对象。
代理分静态代理和动态代理。

  1. 静态代理:是指程序运行前就已经存在了代理类的字节码文件,代理类和被代理类的关系在程序运行前就已经确定。
    特点:
    1.可以再不修改目标对象的功能前提下对目标功能进行扩展。
    2.因为代理对象需要与目标对象实现一样的接口,会出现很多的代理类。
    3.一旦接口增加方法,目标与代理对象都需要维护。
    4.一个静态代理类只代理一个具体类,如果需要对实现了同一接口的不同具体类做代理,静态代理需要为每一个具体类创建相对应的代理类。
  2. 动态代理:它的字节码在程序运行期间动态生成,所以不存在代理类的字节码文件。代理和被代理类关系在程序运行时被确定。
    JDK从1.3开始引人动态代理,可通过java.lang.reflect.Proxy类的静态方法Proxy.new ProxyInsteance动态创建代理类的实例,并且有他动态创建出来的代理类都是Proxy类的子类。

代理行为:代理类往往会在代理对象业务逻辑前后增加一些功能性的行为。如使用事务或打印日志。把这些行为称为代理行为。

spring aop底层实现原理与两种方法对比:
字节码创建方式:
对代理对象的要求:
代理对象创建速度:
代理对象执行速度:

jdk动态代理cglib代理
jvm实现代理类asm
被代理对象实现接口通过继承实现,切不能被final修饰

Spring 事务管理

概述:事务Transact是访问并可能更新数据库中各种数据项的一个程序执行单元unit,这些操作应该要么完整的执行要么不执行。以确保数据完整一致性。
事务的四个关键点:

  1. 原子性:atom事务应给当做一个当独单元的操作,这意味着整个序列操作要么成功要么失败。
  2. 一致性:consistency这表示在数据库中的引用完整性的一致性,表中唯一的主键等。
  3. 隔离性:isolation可能同时处理很多有相同的数量的数据集的事务,每个事务应该与其他事务隔离,以防止数据损坏。
  4. 持久性:dorable一个事务一旦完成全部操作后,这个事务的结果必须是永久性的,不能因系统故障而从数据库中删除。
    总结:ACID
    产生的问题:并发
    1.脏读:是指事务A 读到了事务B还没有提交的数据。
    2.不可重复读:指在在一个事务里读到了两次某个数据,读出来的数据不一样。
    3.幻读:指一个事务里的操作中发现了未被操作的数据。
    使用SQL发布事务到数据库系统过程:
    1.使用begin transction命令开始事务。
    2.使用SQL查询语句执行各种删除、更新或插入操作。
    3.如果所有的操作都成功了,则执行提交操作,否则回滚所有操作。
    Spring事务管理类型:
作用范围实现方式
局部事务声明式
全局事务编程式

局部事务:他是一个特定于一个单一的事务资源,如一个JDBC连接。局部事务管理在一个集中的计算环境中是有用的,改计算环境中应用程序组件和资源位于一个单位点,而事务管理只涉及到了运行在一个单一机器中的本地数据管理器,局部事务更容易实现。
全局事务:是一个可以跨多个事务资源,如在一个分布式系统中的事务,全局事务管理需要在分布式计算环境中,所有的资源都分布在多个系统中,在这种情况下事务管理需要同时在局部和全局事务系统和所有相关系统的局部数据管理人员之间互相协调。
事务管理的重要操作方法:
前面名称 ,后面说明
TransactionStatus getTransaction(TransactionDefinition definition) 根据指定的传播行为,该方法返回当前活动事务或创建一个新的事务。
void commit(TransactionStatus status) 该方法提交给定的事务和关于它的状态。
void rollback(TransactionStatus status) 该方法执行一个给定事务的回滚。
int getPropagationBehavior() 该方法返回传播行为。Spring 提供了与 EJB CMT 类似的所有的事务传播选项。
int getIsolationLevel() 该方法返回该事务独立于其他事务的工作的程度。
String getName() 该方法返回该事务的名称。
int getTimeout() 该方法返回以秒为单位的时间间隔,事务必须在该时间间隔内完成。
boolean isReadOnly() 该方法返回该事务是否是只读的。
boolean hasSavepoint()
该方法返回该事务内部是否有一个保存点,也就是说,基于一个保存点已经创建了嵌套事务。
boolean isCompleted()
该方法返回该事务是否完成,也就是说,它是否已经提交或回滚。
boolean isNewTransaction() 在当前事务时新的情况下,该方法返回 true。
boolean isRollbackOnly() 该方法返回该事务是否已标记为 rollback-only。
void setRollbackOnly() 该方法设置该事务为 rollback-only 标记。
事务的隔离级别:
就是为了解决并发下的脏读、不可重复读、幻读的问题而产生。为什么要有事务隔离级别:因为事务隔离级别越高,在并发下产生的问题就越少,但同时所消耗付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡,所有设立了几种事务级别,以便不同项目可以根据自己项目的不同的并发情况选择合适的事务隔离级别。
隔离级别及英文词体现:

隔离级别英文词体现
默认隔离级别TransactionDefinition.ISOLATION_DEFAULT
防止误读TransactionDefinition.ISOLATION_READ_COMMITED
防止误读、不可从复读TransactionDefinition.ISOLATION_REPEATABLE_READ
防止误读、不可从复读、虚读TransactionDefinition.ISOLATION_SERIALIZABLE
防止不了什么TransactionDefinition.ISOLATION_READ_UNCOMMITED

一般情况下我们会选择TransactionDefinition.ISOLATION_READ_COMMITED。避免脏读并发性也不差。
事务的传播行为:
事务的传播行为规定了事务方法和事务方法发生嵌套调用时事务如何进行传播。
有八种行为:
名称 说明
TransactionDefinition.PROPAGATION_MANDATORY 支持当前事务;如果不存在当前事务,则抛出一个异常。
TransactionDefinition.PROPAGATION_NESTED 如果存在当前事务,则在一个嵌套的事务中执行。
TransactionDefinition.PROPAGATION_NEVER 不支持当前事务;如果存在当前事务,则抛出一个异常。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED 不支持当前事务;而总是执行非事务性。
TransactionDefinition.PROPAGATION_REQUIRED 支持当前事务;如果不存在事务,则创建一个新的事务。
TransactionDefinition.PROPAGATION_REQUIRES_NEW 创建一个新事务,如果存在一个事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS 支持当前事务;如果不存在,则执行非事务性。
TransactionDefinition.TIMEOUT_DEFAULT 使用默认超时的底层事务系统,或者如果不支持超时则没有。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值