First And MOST Important
Spring AOP的实现原理和场景?
什么是AOP?
AOP--面向方面编程
OOP通过继承可以创建一个从上到下的关系,但是多个对象从左到右OOP比较难办。拿常见的日志功能来说,多个对象可能都需要日志功能。如果使用OOP的概念,则会产生大量冗余的代码。这个时候AOP就有用了。
AOP技术利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,将其名为Aspect。简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP把软件系统横切为两个部分:核心关注点和横切关注点
核心关注点是业务处理的主要流程,与之关系不大的部分是横切关注点。
横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
实现AOP的技术,主要分为两大类:
一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;
二是采用静态织入的方式,引入特定的语法创建Aspect,从而使得编译器可以在编译期间织入(Weaving)和Aspect相关的代码。
Spring IOC是什么?优缺点?
控制反转(Inversion of Control)就是依赖倒置原则的一种代码设计的思路,具体采用的方法是依赖注入(Dependency Injection)。
采用了依赖注入的方法,在初始化过程中不可避免的会写大量的new,然后祝注入到上一级。
IOC容器的作用:根据配置自动注入相关对象来初始化目的对象。
优点:因为把对象生成的定义放在了配置里(如XML),所以当我们需要换一个实现子类将会变成很简单,只要修改配置就可以了。我们甚至可以实现对象热插拨。
缺点:生成一个对象的步骤复杂化了;对象生成使用反射,在效率上有些损耗。
Spring bean的作用域和生命周期
Spring中为Bean定义了5种作用域,分别为singleton(单例)、prototype(原型)、request、session和global session:
- singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。Singleton作用域是Spring中的缺省作用域,也可以显示的将Bean定义为singleton模式,配置为:
<bean id="class" class="Impl"scope="singleton"/>- prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而singleton全局只有一个对象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。
- request:在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。针对每一次Http请求,Spring容器根据该bean的定义创建一个全新的实例,且该实例仅在当前Http请求内有效,而其它请求无法看到当前请求中状态的变化,当目前的Http请求结束,该Bean实例也将会被销毁。
<bean id="class" class="Impl" scope="request"/>- session:在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该Bean实例仅在当前Session内有效。同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。
<bean id="class" class="Impl" scope="session"/>- global Session:在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。
Spring事务传播行为、隔离级别
- 7种传播行为
PROPAGATION_MANDATORY 表示该方法必须运行在一个事务中。如果当前没有事务正在发生,将抛出一个异常
PROPAGATION_NESTED 表示如果当前正有一个事务在进行中,则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于封装事务进行提交或回滚。如果封装事务不存在,行为就像PROPAGATION_REQUIRES一样。
PROPAGATION_NEVER 表示当前的方法不应该在一个事务中运行。如果一个事务正在进行,则会抛出一个异常。
PROPAGATION_NOT_SUPPORTED 表示该方法不应该在一个事务中运行。如果一个现有事务正在进行中,它将在该方法的运行期间被挂起。
PROPAGATION_SUPPORTS 表示当前方法不需要事务性上下文,但是如果有一个事务已经在运行的话,它也可以在这个事务里运行。
PROPAGATION_REQUIRES_NEW 表示当前方法必须在它自己的事务里运行。一个新的事务将被启动,而且如果有一个现有事务在运行的话,则将在这个方法运行期间被挂起。
PROPAGATION_REQUIRES 表示当前方法必须在一个事务中运行。如果一个现有事务正在进行中,该方法将在那个事务中运行,否则就要开始一个新事务。- 5种隔离级别
ISOLATION_DEFAULT 使用后端数据库默认的隔离级别。
ISOLATION_READ_UNCOMMITTED 允许读取尚未提交的更改。可能导致脏读、幻影读或不可重复读。
ISOLATION_READ_COMMITTED 允许从已经提交的并发事务读取。可防止脏读,但幻影读和不可重复读仍可能会发生。
ISOLATION_REPEATABLE_READ 对相同字段的多次读取的结果是一致的,除非数据被当前事务本身改变。可防止脏读和不可重复读,但幻影读仍可能发生。
ISOLATION_SERIALIZABLE 完全服从ACID的隔离级别,确保不发生脏读、不可重复读和幻影读。这在所有隔离级别中也是最慢的,因为它通常是通过完全锁定当前事务所涉及的数据表来完成的。
参考资料
https://blog.csdn.net/fuzhongmin05/article/details/73389779
https://blog.csdn.net/moreevan/article/details/11977115/#
网友评论