The All-in-One Note (17)

request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例,即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效

session:对于每次HTTP Session,使用session定义的Bean豆浆产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效

globalsession:每个全局的HTTP Session,使用session定义的Bean都将产生一个新实例。典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

Bean的生命周期

The All-in-One Note

AOP(面向切面编程)基础

通知(Advice)

通知定义了在切入点代码执行时间点附近需要做的工作。

Spring支持五种类型的通知:

前置通知[Before advice]:在连接点前面执行,前置通知不会影响连接点的执行,除非此处抛出异常

正常返回通知[After returning advice]:在连接点正常执行完成后执行,如果连接点抛出异常,则不会执行

异常返回通知[After throwing advice]:在连接点抛出异常后执行

返回通知[After (finally) advice]:在连接点执行完成后执行,不管是正常执行完成,还是抛出异常,都会执行返回通知中的内容

环绕通知[Around advice]:环绕通知围绕在连接点前后,比如一个方法调用的前后。这是最强大的通知类型,能在方法调用前后自定义一些操作。环绕通知还需要负责决定是继续处理join point(调用ProceedingJoinPoint的proceed方法)还是中断执行

连接点(Joinpoint)

程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法调用时、异常抛出时、方法返回后等等

切入点(Pointcut)

通知定义了切面要发生的“故事”,连接点定义了“故事”发生的时机,那么切入点就定义了“故事”发生的地点,例如某个类或方法的名称,Spring中允许我们方便的用正则表达式来指定。

切面(Aspect)

通知、连接点、切入点共同组成了切面:时间、地点和要发生的“故事”

引入(Introduction)

引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)

目标(Target)

即被通知的对象,如果没有AOP,那么通知的逻辑就要写在目标对象中,有了AOP之后它可以只关注自己要做的事,解耦合

代理(proxy)

应用通知的对象,详细内容参见设计模式里面的动态代理模式

织入(Weaving)

把切面应用到目标对象来创建新的代理对象的过程,aop织入的三种方式:

编译时:当一个类文件被编译时进行织入,这需要特殊的编译器才可以做的到,例如AspectJ的织入编译器;

类加载时:使用特殊的ClassLoader在目标类被加载到程序之前增强类的字节代码;

运行时:切面在运行的某个时刻被织入,SpringAOP就是以这种方式织入切面的,Spring默认使用了JDK的动态代理技术,如果没有实现接口则转为使用Cglib

Spring事务

Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的

Spring事务的种类

编程式事务管理使用TransactionTemplate

声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务

spring的事务传播行为

PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置

PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行

PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常

PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务

PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常

PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行

Spring中的隔离级别

ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别

ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据

ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新

ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新

ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据库所做的更新

SpringMVC SpringMVC请求处理流程

The All-in-One Note

SpringMvc的控制器是不是单例模式是不是线程安全

是单例模式,所以在多线程访问的时候有线程安全问题

不要用同步,会影响性能,解决方案把控制器变为无状态对象

如果一定有成员变量,可以增加注解@Scope(value = "prototype")改为原型模式

Netty Netty的特点

一个高性能、异步事件驱动的NIO框架,它提供了对TCP、UDP和文件传输的支持

使用更高效的socket底层,对epoll空轮询引起的cpu占用飙升在内部进行了处理,避免了直接使用NIO的陷阱,简化了NIO的处理方式。

采用多种decoder/encoder 支持,对TCP粘包/分包进行自动化处理

可使用接受/处理线程池,提高连接效率,对重连、心跳检测的简单支持

可配置IO线程数、TCP参数, TCP接收和发送缓冲区使用直接内存代替堆内存,通过内存池的方式循环利用ByteBuf

通过引用计数器及时申请释放不再引用的对象,降低了GC频率

使用单线程串行化的方式,高效的Reactor线程模型

大量使用了volitale、使用了CAS和原子类、线程安全类的使用、读写锁的使用

Netty执行流程

当客户端网络I/O请求来了就需要为其通过Bootstrap创建一个ChannelChannel是一个Socket的抽象

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyysp.html