文章目录
Q:对spring框架的理解?
Spring是一个轻量级开源框架,它存在的目的是为了解决企业级应用开发中业务逻辑层
和其他各层
的耦合问题。
Spring负责基础架构,开发者可以专注于程序编写。其中最重要的核心是IOC和AOP。
IOC是控制反转
:是指将类的创建
和依赖关系
写在配置文件中,通过依赖注入的方式将其注入到相应的类中,把对象的创建交给工厂。
AOP是面向切面编程
:是指将程序中重复的代码抽取出来,在不修改源码的基础上,使用动态代理的技术,增强已有的方法,提高代码的复用性。
Q:IOC和DI原理 ?(map集合)
- 解析spring的清单文件,就是xml解析,把xml内容解析到内存中。
- 循环遍历清单文件中的bean节点,每一个bean节点对应创建一个对象。
- 把创建完的对象存储到一个map集合,此map集合就是一个容器。
- 如果bean节点有property节点,需要注入数据。
循环每一个bean节点中的property节点,读取name属性和ref属性
反射调用set方法,并对象注入。
Q、依赖注入的几种方式?
依赖注入(DI)思想
:Spring使用set方法
或者带参数的构造方法
创建对象时,将其属性自动设置为所需值的过程。
分类:接口注入、Setter方法注入、构造器注入。
(1)接口注入 :由于灵活性和易用性比较差,从Spring4开始已被废弃。
(2)构造器依赖注入:是容器通过触发一个类的构造器来实现。
(3)Setter方法注入:容器通过JavaBean规范的setter方法完成注入的,灵活且可读性高。
依赖注入:是当前最流行的IoC实现方式。
Q:请描述Spring中bean的作用域?
Spring中Bean有五种作用域
名称 | 描述 |
---|---|
singleton | 单例的(默认值): 一个bean 在 ioc 容器中只有一个实例 |
prototype | 多例的:一个 bean在ioc容器中可以有多个实例 |
request | 作用于web应用的请求范围 |
session | 作用于web应用的会话范围 |
global-session | (全局session)作用于集群环境的会话范围,当不是集群环境时,他就是session |
Q:Spring bean 的生命周期?
Bean 定义
:在配置文件里面用来进行定义。
Bean 初始化
:有两种方式初始化:
①在配置文件中通过指定 init-method 属性来完成
②实现 org.springframwork.beans.factory.InitializingBean
接口
Bean 调用
:有三种方式可以得到 bean 实例,并进行调用
Bean 销毁
:销毁有两种方式
①使用配置文件指定的 destroy-method
属性
②实现 org.springframwork.bean.factory.DisposeableBean
接口
Q:Spring 的通知是什么?有哪几种类型?
通知是个在方法执行前或执行后要做的动作,实际上是程序运行时要通过 SpringAOP框架
触发的代码段。
Spring 切面可以应用五种类型的通知:
before
:前置通知,在一个方法执行前被调用。
after-returning:
后置通知,仅当方法成功完成后执行的通知。
after-throwing:
异常通知,在方法抛出异常退出时执行的通知。
after
: 最终通知,在方法执行之后调用的通知,无论方法执行是否成功。
around:
环绕通知,在方法执行之前和之后调用的通知。
Q:Spring事务的隔离级别?
1、ISOLATION_DEFAULT
:默认,这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。
2、ISOLATION_READ_UNCOMMITTED
:读未提交,允许另外一个事务可以看到这个事务未提交的数据。
3、ISOLATION_READ_COMMITTED
:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。
4、ISOLATION_REPEATABLE_READ
:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。
5、ISOLATION_SERIALIZABLE
:串行化,一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。
Q:Spring的事务传播行为有哪些?
1、PROPAGATION_Required
:(有就加入,没有就创建)如果当前没有事务,就创建一个新事务。如果当前存在事务,就加入该事务。该设置是最常用的设置。
2、PROPAGATION_Supports
:(有就加入,没有就不要)支持当前事务。如果当前存在事务,就加入该事务。如果当前不存在事务,就以非事务执行。
3、PROPAGATION_mandatory
:(有就加入,没有就跑异常)支持当前事务。如果当前存在事务,就加入该事务。如果当前不存在事务,就抛出异常。
4、PROPAGATION_Required_New
:(无论是否有都创建新事务)创建新事务,无论当前存不存在事务,都创建新事务。
5、PROPAGATION_Not_Supported
:(不要事务,有就挂起)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、PROPAGATION_Never
:(不要事务,有就抛异常)以非事务方式执行,如果当前存在事务,则抛出异常。
7、PROPAGATION_Nested
:(有就嵌套,没有就创建)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
Q: 核心容器BeanFactory 与 AppliacationContext 有什么区别?
ApplicationContext:(继承BeanFactory)
它在构建核心容器时,创建对象采取的策略是立即加载
的方式。也就是说,只要一读完配置文件马上就创建文件中配置的对象。执行完该条语句,构造方法被执行。(单例对象使用 采用此接口)
BeanFactory:
它在构建核心容器时,创建对象采用的策略是延迟加载
的方式。也就是说,什么时候根据ID获取对象了,什么时候才真正的创建对象。(多例对象使用)
ApplicationContext的三个常用实现类:
ClassPathXmlApplicationContext:
他可以加载类路径
下的配置文件。
FileSystemXmlApplicationContext
:他可以加在磁盘任一路径
下的配置文件(必须有访问权限)
AnnotationConfigApplicationContext
: 他是用于读取注解
创建容器的,是明天的内容。
Q:Spring 框架中的单例 bean 是线程安全的吗?
不是线程安全的。当存在共享变量时,大家都能去调用,此时就存在线程安全问题。
Q: Spring 中的设计模式有哪些?
工厂模式:
BeanFactory
就是简单工厂模式的体现,用来创建对象的实例;
单例模式:
Bean
默认为单例模式。
代理模式:
Spring的AOP
功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法:
用来解决代码重复的问题。比如. RestTemplate
, JmsTemplate
, JpaTemplate
。
观察者模式:
定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现ApplicationListener
。