spring
2021-06-01 16:17:34 0 举报
登录查看完整内容
spring原理
作者其他创作
大纲/内容
spring
个人信息
什么是spring
spring是一个整合框架,给我们带来春天的感觉。
300行代码实现
加载配置文件
扫描相关的类
讲扫描到的类放入ioc容器
完成依赖注入
初始化HandlerMapping
AOP
流程
BeanPostProcessor后置处理器
分支主题
IOC
控制反转 将对象的创建交给ioc容器将扫描包下添加注解的类 通过反射 将对象注入到ioc容器
核心容器
BeanFactory
定义ioc容器的基本行为只关系能从工厂得到什么产品,不关心工厂是怎么生产这些产品要知道怎么生产产品,看具体ioc的实现
BeanDefinition
BeanDefinitionReader
对spring配置文件进行解析
DispatcherServlet
子主题
将xml中的bean换成beanDefinition
会根据过滤规则找到注解,spring默认的过滤规则需实现@component可自定义过滤器 @某某自定义注解(includeFilters = )
在IOC容器中注册
容器解析得到beanDefinition后,内部维护一HashMa来保存BeanDefinition
DI
依赖注入对象是被动接受依赖类,而不是自己主动去找。在容器实例化对象的时候主动将他依赖的类注入给它 将扫描包下添加注解类的添加注解的属性 注入对象(从ioc容器获取对象) 完成属性实例化
获取IOC容器中的bean getBean(String name)
AbstructBeanFactory
1)实例化阶段
2)依赖注入阶段
循环IOC容器执行以来注入
事务
解决数据操作带来的完整性和一致性问题。
特性
原子性(Automicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要 么都做,要么都不做。
一致性(Consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。 一致性与原子性是密切相关的。
隔离性(Isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及 使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability)。持久性也称永久性(Permanence),指一个事务一旦提交,它 对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何 影响。
隔离级别
隔离级别:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能影响也越大。
级别
READ COMMITTED Read Committed 读取提交内容大多数数据库系统的默认隔离级别(但是不是MySQL的默认隔离级别),满足了隔离的早先简单定义:一个事务开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的“不可重复读”。这意味着用户运行同一个语句两次,看到的结果是不同的。
READ UNCOMMITTED Read UnCommitted 读取未提交内容在这个隔离级别,所有事务都可以“看到”未提交事务的执行结果。在这种级别上,可能会产生很多问题,除非用户真的知道自己在做什么,并有很好的理由选择这样做。本隔离级别很少用于实际应用,因为它的性能也不必其他性能好多少,而别的级别还有其他更多的优点。读取未提交数据,也被称为“脏读”
REPEATABLE READ Repeatable Read 可重复读MySQL数据库默认的隔离级别。该级别解决了READ UNCOMMITTED隔离级别导致的问题。它保证同一事务的多个实例在并发读取事务时,会“看到同样的”数据行。不过,这会导致另外一个棘手问题“幻读”。InnoDB和Falcon存储引擎通过多版本并发控制机制解决了幻读问题。
SERIALIZABLE Serializable 可串行化该级别是最高级别的隔离级。它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之,SERIALIZABLE是在每个读的数据行上加锁。在这个级别,可能导致大量的超时Timeout和锁竞争Lock Contention现象,实际应用中很少使用到这个级别,但如果用户的应用为了数据的稳定性,需要强制减少并发的话,也可以选择这种隔离级
导致的问题
脏读,不可重复读,幻读
脏读:事务1对数据进行了增删改,但未提交,事务2可以读取到事务1未提交的数据。如果事务1回滚,那么事务2就读取到了脏数据。不可重复读:事务1进行两次读操作,第一次读操作和第二次读操作之间,事务2对数据进行了修改,导致事务1两次读取不一致。幻读:事务1进行两次读操作,第一次读操作和第二次读操作之间, 事务2 插入了相同搜索条件的新数据,事务1再次按照原先条件进行读取时,发现了事务2 新插入的数据 称为幻读不可重复读注重的是值是否相等,幻读注重的是条数
spring事务的传播属性
传播机制
Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考。
spring在TransactionDefinition接口中定义了七个事务传播行为:
propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
事务的嵌套
循环依赖
A依赖B,B依赖A 形成依赖闭环IOC容器对bean的初始化根据BeanDefinition循环迭代,有一定的顺序。在执行依赖注入时,需要自动赋值的属性对应的对象有可能还没初始化,没初始化也就没有对应的实例注入。
三级缓存
一级缓存singletonObjects
用于保存实例化、注入、初始化完成的bean实例
二级缓存earlySingletonObjects
用于保存实例化完成的bean实例
三级缓存singletonFactories
用于保存bean创建工厂,以便于后面扩展有机会创建代理对象
先从一级缓存里拿
如果一级缓存中没有 但有创建标志 说明是循环依赖
如果二级缓存中也没有 那就从三级缓存中拿
将创建出来的对象重新放入二级缓存中
interview
收集
1.spring中的bean是线程安全的吗?为什么?
答:spring中的bean是否线程安全与spring无关,因为spring只承担了创建和管理bean的职责,并没有对bean进行任何修改。spring中的bean是自己创建的。
2.Spring IOC和DI的工作原理并用自己的语言描述出来。
答:Spring IOC的基本流程1)读取配置文件2)解析配置文件,并封装成BeanDefinition3) 把BeanDefinition对应的实例放入到容器进行缓存Spring DI的基本流程1)循环读取BeanDefinition的缓存信息2)调用getBean()方法创建对象实例3)将创建好的对象实例包装为BeanWrapper4)将BeanWrapper对象缓存到IOC容器5)循环IOC容器执行以来注入
3.手绘Spring IOC和DI部分的类结构图
答:BeanDefinition保存每个bean配置的解析结果BeanWapper 保存原始对象和原始对象的classApplicationContext Spring 中最核心的IOC工厂,也是Spring的主入口其中BeanDefinition、BeanWapper和ApplicationContext三者的关系如下图所示:
1.spring是什么?
1)简化开发,解放双手2)spring框架是粘合剂,将其他框架完美的粘合起来
IOC与DI?
spring bean的生命周期?
所谓生命周期,从创建到调用到销毁的一个过程。Spring bean factory负责管理在spring容器中 被创建的bean的生命周期。对象创建1)从xml或注解@Bean或Java代码BeanDefinitionBuilder中font color=\"#f1753f\
spring bean各作用域之间的区别?
1)singleton 作用域全局,默认的bean范围,不管接受到多少个请求,每个容器中只会创建一个bean实例,单例模式由bean自身来维护。2)prototype 全局的,与单例范围相反,为每一个bean请求提供一个实例3)request 在一次请求发起和结束之间 请求结束bean失效并被垃圾收集器回收4)session 在一个session创建和session失效之间,有效期配置一般默认是30分钟5)global-session 全局会话,所有会话共享一个实例。
.spring中的bean是线程安全的吗?
线程安全这个问题,要从单例与原型Bean分别进行说明。font color=\"#f15a23\
请问spring中用到了哪些设计模式
与springboot区别
spring事务怎么传播?
BeanFactory和FactoryBean的区别?详情看链接https://note.youdao.com/s/bvCT4rEO
ApplicationContext 继承图
FactoryBean:FactoryBean 是spirng提供的工厂bean的一个接口FactoryBean 接口提供三个方法,用来创建对象,FactoryBean 具体返回的对象是由getObject 方法决定的。
BeanFactory是个bean 工厂,是一个工厂类(接口), 它负责生产和管理bean的一个工厂是ioc 容器最底层的接口,是个ioc容器,是spring用来管理和装配普通bean的ioc容器(这些bean成为普通bean)。FactoryBean是个bean,在IOC容器的基础上给Bean的实现加上了一个简单工厂模式和装饰模式,是一个可以生产对象和装饰对象的工厂bean,由spring管理后,生产的对象是由getObject()方法决定的(从容器中获取到的对象不是“ FactoryBeanTest ” 对象)。
项目中如何应用AOP?
生命式事务管理、日志监听、权限管理、安全监控。。。
一个方法内,for循环内重复操作数据库?
如果循环不可控,千万千万不要在一个方法内for循环去查询数据库,因为会多次连接数据库,导致连接池的数量不可控。解决方案:1)分页(可控,每页连接可控) 2)缓存 3)联合查询
请解释各种自动装配模式的区别?
请解释下 Spring 框架中的 IOC容器?
Spring中的org.springfra mework.bea ns 包和org.springfra mewo rk.co ntext包构成了Spring框架IOC容器的基础。Bean Factory 接口提供了1个先进的配置 机制,使得任何类型的对象的配置成为可能 。App Ii cati onContex接口对BeanFactory (是1个子接口)进行了扩展,在BeanFactory的基础上添加了其他功能,比如与Spring的AOP更容男集成,也提供了处理 message resource的机制(用于国际化)事件传播以及应用层的特别配置,比如针对Web应用的Web ApplicationContext。
在Spring 中可以注入 null 或空字符串吗?
完全可以。
0 条评论
回复 删除
下一页