必知必会:Spring

Posted 时光编辑师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了必知必会:Spring相关的知识,希望对你有一定的参考价值。

  • 1.什么是Spring?

Spring是一个轻量级、非入侵式的控制反转(IOC)和面向切面(AOP)的框架,提供了快捷测试支持,快速集成功能、拥有复杂的API模板支持。

  • 2.Spring最主要的七大模块

(1)Spring Core:Spring核心,提供IOC和依赖注入DI特性。
(2)Spring Context:Spring上下文容器,是BeanFactory功能加强的一个子接口。
(3)Spring Web:提供Web应用开发支持。
(4)Spring MVC:Web应用中MVC思想的实现。
(5)Spring ORM:支持用于流行的ORM框架的整合,如S+H、S+M等。
(6)Spring AOP:面向切面编程,提供了与AOP联盟兼容的编程实现。

  • 3.Spring常用注解:

@Controller、@RestController、@RequestMapping、@ResponseMapping、@PathVariable、@RequestBody、@ResponseBody

@Component、@Service、@Repository、@Autowied、@Qualifier、@Resource、@Value、@Bean、@Scope

@Aspect、@Before、@After、@Around、@AfterReturning、@AfterThrowing、@PonitCut、@EnableAspectJAutoProxy

@Transactional

  • 4.Bean的Scope有哪五种

(1)singleton: 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例
(2)prototype:表示每次获得bean都会生成一个新的对象
(3)request:表示在一次http请求内有效(只适用于web应用)
(4)session:表示在一个用户会话内有效(只适用于web应用)
(5)globalSession:表示在全局会话内有效(只适用于web应用)

  • 5.Spring用了哪些设计模式

工厂模式:BeanFactory、ApplicationContext;
代理模式:Spring AOP
单例模式:Spring中的Bean默认是单例的
模板模式:JdbcTemplate、RedisTemplate、TransactionTemplate
适配器模式:AOP的增强或通知
策略模式:Resource接口,有不同的实现类,会根据不同的策略去访问资源。

  • 6.IOC和DI

IOC:由容器来负责控制对象的生命周期和对象间的关系。
DI:容器在实例化对象的时候把它依赖的类注入给它。

IOC的实现机制:简单工厂+反射。

IOC容器工作的过程:容器启动阶段和Bean实例化阶段。
容器启动阶段主要是加载并分析配置信息,保存到对应的Bean定义中(装载到BeanDefinition),最后把BeanDefinition注册到对应的BeanDefinitionRegistry。
Bean实例化阶段:实例化对象,装配依赖、生命周期回调,对象的处理,注册回调接口。

Spring IOC中Bean的生命周期:实例化、属性赋值、初始化、使用、销毁。

  • 7.Spring中的单例Bean是线程安全的吗?

不是,因为单例Bean是全局只有一个Bean,所有线程共享,如果存在对Bean中成员变量的修改,就会存在线程安全的问题。

解决:单例Bean对象中的成员变量保存在ThreadLocal中,能保证多线程下变量的隔离。

  • 8.Spring中的多例Bean是线程安全的吗?

如果将Bean定义为多例,每个线程请求过来都会创建一个新的Bean,则肯定是线程安全的。

  • 9.如何解决循环依赖

通过三级缓存解决。
一级缓存:单例池Map<String, Object> singletonObjects,用于保存实例化、属性赋值、初始化完成的Bean实例。
二级缓存:早期对象Map<String, Object> earlySingletonObjects,用于保存实例化完成的bean实例。
三级缓存:早期对象工厂Map<String, ObjectFactory<?>> singletonFactory,用于保存bean创建工厂。

  • 10.AOP

AOP,就是面向切面编程,把一组业务逻辑相同的代码抽取到一个独立的模块中,和任务逻辑解耦,不改变任务逻辑代码,就可以给任务动态添加功能。
AOP的核心是动态代理,如果是实现了接口的话,就会使用JDK动态代理,否则使用CGLIB代理。
JDK动态代理原理:动态创建一个符合目标类型的接口的代理实例,核心逻辑是定义横切逻辑再通过反射调用的目标代码,并在这个过程中,根据包装逻辑对目标方法前后做对应处理。
CGLIB代理原理:通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,来织入横切逻辑。

  • 11.Spring事务

Spring只提供统一事物管理接口,具体实现都是由各数据库自己实现。一般使用声明式事务注解@Transcation,其本质是通过AOP功能对方法前后进行拦截。
另外如果要细化到代码块级别,可以使用编程式事务DataSourceTransactionManager进行显式执行事务。

  • 12.Spring事务隔离级别:

(1)默认隔离级别:使用数据库默认的隔离级别,oracle默认是读已提交,mysql默认是可重复读。
(2)读未提交;
(3)读已提交;
(4)可重复度;
(5)串行化。

  • 13.Spring事务的传播机制

Spring事务的传播机制,是指的当多个事务同时存在时,如何处理这些事务。
因为Spring事务传播机制是使用的ThreadLocal实现的,所以如果调用的方法在新线程调用,事务传播实际上是会失效的。
在同一个类中A方法调用B方法,如果A、B均有事务,则使用A事务机制;如果A无事务,B有事务,则事务失效。

  • 14.多线程环境如何保证事务的一致性

声明式事务无法解决,需使用编程式事务解决,实现事务在两个线程间的传播。

  • 15.Spring MVC Restful风格的接口流程是什么样的?

restful接口的响应格式是json。后端常用注解@ResponseBody。
工作流程:
(1)客户端向服务端发送请求, 请求到前端控制器DispatcherServlet;
(2)DispatcherServlet拿到请求,开始调用HandlerMapping处理器映射器,得到本次请求由哪个Controller来处理;
(3)DispatcherServlet调用HandlerAdapter处理器适配器,告诉适配器要执行哪个Controller;
(4)执行invokerAndHandle方法,完成对Controller的请求处理。
(5)HandlerAdapter处理返回值,将返回值写入ServletServerHttpResponse输出流中,在写入的过程中会对返回值进行json序列化。
(6)执行完请求完成后,ModelAndView为null,ServletServerHttpResponse里就写入了响应。

以上是关于必知必会:Spring的主要内容,如果未能解决你的问题,请参考以下文章

学习SpringMVC必知必会~springmvc的数据校验表单标签文件上传和下载

精选Spring Boot三十五道必知必会知识点!

必知必会的设计原则——合成复用原则

MySQL必知必会 第7-9章

SQL必知必会(第五版)

MySQL必知必会-资源下载