Spring

Spring


以下内容部分来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846
以下内容部分来自原文,原文地址:https://www.cnblogs.com/wangyayun/p/6530189.html
以下内容部分来自原文,原文地址:https://blog.csdn.net/gloomy_114/article/details/62233564

1、什么是Spring

​ 个人的理解是容器,转载这service层和dao层的类对象,通过单例的模式创建出相应的对象,从而省去大量事务处理时的创建相应类,可直接从容器中获取该对象。

2、IOC

:什么是IOC

控制反转,**即“控制反转”,不是什么技术,而是一种设计思想。**将bean的对象交给Spring容器进行管理,通过反射的方式,解析xml或demo4j,来创建对象实例。Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制

:优点是什么

:当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了。能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

:控制了什么

:**IoC 容器控制了对象,主要控制了外部资源获取(不只是对象包括比如文件等)**有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

个人理解控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方。就是由spring来负责控制对象的生命周期和对象间的关系。相当于是一个中介所。也就是先前在容器中创建相应的对象

3、DI

问:什么是DI

答:依赖注入,解决对象之间依赖。组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。**依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。**通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

注意点

● 谁依赖于谁:当然是应用程序依赖于IoC容器

● 为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源

● 谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象

​ ● 注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

个人理解IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI来实现的,也就是从容器中引出对应的对象给需要对象的类的过程

4、如何证明spring的对象是单例的

:通过构造函数打印查看,或者创建俩个相同的对象,判断俩个对象是否相等为true

:spring如何保证线程安全

:spring加载对象使用的是单例模式下的饿汉模式,保证了线程安全。

5、注解

5、1 创建对象以及处理对象依赖关系的相关注解
@Component    将这个对象加入IOC容器中

@Repository   作用等同于@Component  在持久层使用
@Service      作用等同于@Component  在业务逻辑层使用
@Controller   作用等同于@Component  在控制层使用

@Resource     属性注入,按名称从ioc容器中找到相应的对象注入  注意:是从jdk1.6后才有@Resource注解
@Autowired    属性注入,按类型从ioc容器中找到相应的对象注入,也可强制从名称注入 
	- 用法   @Autowired() @Qualifier("baseDao")    

6、静态代理和动态代理

6、1 代理设计模式

作用:提供目标与对象进行访问方式(例如中介)

好处:提高安全性 AOP 事务(事务的后面提交或者回滚)

6、2 静态代理与动态代理的区别

静态代理:需要生成代理类,直接对类生成代码

优点: 扩展原功能,不侵入原代码。

动态代理:不需要生成代理类,直接对实现了接口的类生成代理

动态代理的方式
JDK动态代理通过反射机制
cglib动态代理通过字节码
6、3 AOP 面向切面编程

面向切面编程本质是一种思想。

应用的场景:事务管理,日志打印,性能统计,权限控制,在不同的方法中,需要进行相同的操作

目的:解决代码冗余,抽出重复的方法来注入

关注点重复代码区
切面抽取重复的代码
切入点拦截的方法位
使用Aop的方法xml 或者 注解

7、事务

**问**:什么是事务

**答**:本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。

**问**:事务的原理

**答**:AOP编程+环绕通知(begin+commit)+异常通知(rollback)

深入理解Spring事务原理

7、1 特性
特性
原子性(Atomicity)事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
一致性(Consistency)一旦事务完成(不管成功还是失败),系统必须确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。在现实中的数据不应该被破坏。
隔离性(Isolation)可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
持久性(Durability)一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。通常情况下,事务的结果被写到持久化存储器中。
7、2 核心接口类
TransactionDefinition规范事务的特定表现形式
TransactionStatus事务运转的状态形式
PlatformTransactionManager根据给定的规则获取事务现有状态的具体表现,进行具体操作
7、3 相关注解
@Transactional
@Transactional注解可以作用在接口,接口方法,类以及类方法上。当作用在类上时,该类所有的public方法都将具有该类型的事务属性。作用在方法上的标注将覆盖类级别的定义。
7、4 Spring中的事务管控

具体参考: Spring中的事务管控

7、5 事务的分类
Spring事务分类
编程式事务(手动事务)自己commit,AOP实现自动化事务
声明式事务使用xml 或者 注解 @Transactional
7、6 注意点

1、代码中,当你启动了一个事务,最后一定要释放,不然在高并发中,导致占大量内存

2、使用声明事务方法一定不要try{catch},将异常抛出。业务逻辑层不要使用try将异常抛给上一次,会导致不进行回滚

3、try catch会捕获异常,当你需要异常来执行回滚时,不能使用try,会把异常捕获掉,从而导致不会执行回滚

7、7 事务传播行为

事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition定义中包括了如下几个表示传播行为的常量:

- PROPAGATION_REQUIRED:当前方法必须在事务中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果没有,则新建一个事务。此选项为默认值。
- PROPAGATION_SUPPORTS:如果当前存在事务环境,该方法就加入事务中执行。如果当前没有事务,就以非事务的方式执行。
- PROPAGATION_MANDATORY:当前方法必须在事务中运行,如果当前没有事务,就抛出异常。
- PROPAGATION_REQUIRES_NEW:当前方法总是会为自己发起一个新的事务,如果当前方法已经运行在一个事务中,则原有事务被挂起,创建一个属于自己的事务,直到自身的事务commit结束,原有的事务才会恢复执行。
- PROPAGATION_NOT_SUPPORTED:当前方法总是以非事务方式进行操作。如果当前存在事务,就把当前事务挂起,等该方法以非事务的状态运行完成,再继续原来的事务。
- PROPAGATION_NEVER:当前方法总是以非事务方式进行操作。如果方法在事务范围内执行,容器则抛出异常。
- PROPAGATION_NESTED:当前方法执行时,如果已经有一个事务存在,则以嵌套事务的方式运行在当前事务中。子事务可以单独的进行回滚提交操作,不会对父事务造成影响。但是子事务要受父事务的影响。
7、8 事务隔离级别

事务隔离级别,是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量

- ISOLATION_DEFAULT:采用数据库默认隔离级别
- ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- ISOLATION_READ_COMMITTED:大多数主流数据库的默认事务等级。保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了脏读。该级别使用与大多数系统。
- ISOLATION_REPEATABLE_READ:保证一个事务不会修改已经由另一个事务读取但为提交(回滚)的数据,也就是对同一字段在同一事务中多次读取的结果都是一致的。避免了脏读和不可重复读的情况,但是带来了更多的性能损耗。
- ISOLATION_SERIALIZABLE:最严格的级别,事务串行执行,资源消耗最大。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值