什么是Spring
Spring 是Java企业级应用的开源开发框架,Spring主要用于开发Java应用,简化Java企业级应用开发。
项目中为什么要用Spring
直接说Spring的好处
轻量级
轻量:首先Spring是轻量级的IOC和AOP容器框架,是为Java应用程序提供基础服务的一套框架,目的是简化企业级应用开发,使开发者只关心业务需求,常见的配置有3种:基于XML的配置、基于注解的配置、基于Java的配置。
核心模块:
Spring Core:提供IOC服务
Spring AOP:面向切面
Spring DAO:对JDBC的封装
Spring ORM:对ORM框架的支持
Spring Web:提供了基本面向Web的特性,如多文件上传
Spring MVC:MVC开发。
Autowired 和 Resource 有什么区别
两个注解都是做为Bean的注入使用
Autowired 是Spring的注解、Resource 是有J2EE提供,但Spring支持该注解的注入。
Autowired 只支持按照byType进行注入,Resource 默认是按照byName进行注入。
Resource 的作用相当于 Autowired ,这是他们的注入方式不一致。
依赖注入的方式有几种,分别是什么
构造器注入:将依赖的对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入。
优点:初试化完成即可使用对象
缺点:注入对象很多时,构造参数列表会很长。
setter方法注入:通过提供的成员变量setter函数进行注入。
优点:灵活,可以选择性的注入需要的对象。
缺点:尚未完成注入,不能立即使用
接口注入:依赖类必须要实现指定的接口。
说说你对MVC的一个理解
M-model:完成业务逻辑、service+dao+entity
V-view:视图、界面的展示 html、jsp等
C-controller:控制器、转发。
springMVC 是 Spring后续的产品,其实就是Spring在原有的基础上增加了对Web模块的支持。
工作原理:
用户发送请求到前端控制器DispatcherServlet
DispatcherServlet收到请求调用HandlerMapping处理器
处理器映射器找到具体的处理器,生成相关对象一并返回给DispatcherServlet
DispatcherServlet调用HandlerAdapter处理器进行适配
HandlerAdapter经过适配调用具体的控制器
控制器执行完成过后返回给视图
HandlerAdapter将控制器的执行结果返回给DispatcherServlet
DispatcherServlet将视图传给ViewReslover视图解析器
ViewReslover解析后返回给具体的View
DispatcherServlet根据View进行渲染
DispatcherServlet响应用户
组件说明 :
DispatcherServlet:做为前端控制器,整个流程的控制中心,控制其他组件执行,统一调度。
HandlerMapping:处理映射器,根据请求的url查找HandlerMapping
hander:自己处理的逻辑代码
HandlerAdapter:扩展处理器适配器,适配器设计模式。
ViewReslover:视图解析器,jsp、freemarker等
Spring AOP的理解
Spring AOP是面向切面的,能够将那些与业务无关,却为业务逻辑共同调用的(日志处理、事务处理、权限控制),便于减少系统重复的代码,并有利于未来的可扩展性和可维护下。
Spring AOP是基于动态代理,如果要代理的对象实现了某个接口,那么就采用JDK动态代理去代理对象,如果没有实现接口,则无法使用JDK实现动态代理,转而使用CGlib动态代理,生成一个被代理对象的子类作为代理。
JDK只提供接口代理、不支持类的代理。
调用时:先去调用处理类进行增强,再通过反射的方式调用目标方法,从而实现AOP
CGlib是通过继承的方式实现动态代理的,如果某个类被表示为final,那么无法使用CGlib进行动态代理。
JDK的代理性能更好。
Spring AOP和AspectJ AOP有什么区别
Spring AOP属于运行时增强,AspectJ属于编译增强
Spring AOP基于动态代理,AspectJ基于字节码操作
Spring AOP已经集成了AspectJ、AspectJ功能更加强大,但Spring AOP使用起来更加简单。
什么是切面通知呢,有哪些类型
通知实在方法执行前或者执行后要做的动作,实际就是程序需要通过AOP触发的代码段。
Spring切面有5中类型的通知
before:前置通知,在方法前被执行
after:在方法执行之后调用的通知,无论方法是否执行成功
after-returning:方法执行成功执行通知
after-throwing:在方法抛出异常退出时执行的通知
around:在方法执行前和执行后的通知
Spring IOC的理解
IOC控制反转,是指创建对象的控制权转移,以前创建对象的主动权都是由自己把控,而现在这种权利转移到Spring进行把控,并由容器去创建实例和管理实例之间的依赖关系。对象与对象之间的松散耦合,也利于功能的复用。
最直接的表达就是,IOC让对象创建不用自己去new了,可以由Spring自动产生,使用Java的反射机制,根据配置文件在运行时动态的去创建和管理对象,并调用对象的方法。
Spring IOC的三种注入方式:构造器注入、setter方法注入、接口注入。
Spring bean的生命周期
实例化Bean:对于BeanFactory容器,通过获取BeanDifination对象信息,进行实例化。
设置对象属性(依赖注入): BeanWrapper完成依赖注入
处理Aware接口:
BeanPostProcessor:
InitializingBean 与 init-method
DisposableBean
destroy-method
Spring 支持几种Bean的作用域
singleton:默认,每个容器只有一个Bean的实例。
prototype:为每个Bean请求提供一个实例
request:每个网络创建一个实例,请求完成后,被垃圾回收器回收。
session:与request类似,确保每个session中有一个Bean的实例。
global-session:全局作用域。
Spring中用到了哪些设计模式
简单工厂模式:BeanFactory、通过传入一个唯一标识来获取Bean对象。
工厂模式:FactoryBean、
单例模式:scope=“singleton”
原型模式:scope=“prototype”
代理模式:基于JDK和CGlib的动态代理
适配器模式:MVC中的Adapter
模板方法模式:JdbcTemplate
说说Spring 中 ApplicationContext 和 BeanFactory 的区别
包目录不同:一个来源bean包,一个来源context包
国际化:BeanFactory 没有实现MessageResource接口,不支持国际化、ApplicationContext 支持。
强大的事件机制:ApplicationContext 强大的事件机制,通过观察者设计模式来实现。
对web应用的支持:BeanFactory通常以编程的方式进行创建、ApplicationContext以声明试创建,如ContextLoader。
延迟加载:BeanFactroy是通过延迟来注入Bean的。
ApplicationContext继承了BeanFactory ,BeanFactory是Spring比较原始的Bean,ApplicationContext是对BeanFactory很好的扩展。
Spring中的单例Bean是线程安全的吗
关于单例Bean是否是线程安全和并发问题,需要我们自己去解决
Spring只管Bean的创建,可以根据参数进行配置
实际上大部分的Bean都没有可变状态,所以从某种程度来说单例Bean是线程安全的,如果Bean有多种状态的话,需要自行保证Bean的线程安全,就是把Bean的作用域由Singleton配置为Prototype。
Spring是怎么解决循环依赖的
比如:A依赖B、B依赖C、C依赖A
首先A完成初始化,将自己提现曝光 ,在初始化的时候发现依赖B,然后去尝试获取B,但是这个时候B还没有被初始化
然后B走创建流程,发现B又依赖C,C还没有被创建
这个时候C开始走初始化流程,但是这个时候发现依赖A,这个时候A已经添加到缓存中,然后通过ObjectFactory#getObject() 拿到A对象,C拿到A对象顺利完成初始化,然后将自己添加到一级缓存中。
回到B,B也可以拿到C完成初始化,A也可以顺利拿到B进行初始化。
三级缓存、提前曝光。
说说事务的隔离级别
未提交读(Read Uncommit):脏读,可能读取到其他事务没有提交的数据。
提交读(Read Commit):只能读到已提交的数据。
可重复读(Repeated Read):存在幻读(多个事务修改同一条记录,彼此之间不知道,当事务提交后,后面的事务会覆盖前面的事务)
串行化(Serializable):读写都会阻塞。
事务的传播级别
spring 默认的传播级别:如果当前存在事务就加入,不存在就创建。
新老事务隔离,外部事务抛异常不影响内部事务。
Spring事务实现方式
编程式事务管理:灵活性强,维护性低
声明式事务:事务与业务代码分离,用得比较多。
事务的三要素
数据源:表示具体的事务资源,是事务真的处理者。
事务管理器:打开、提交、回滚
事务应用和属性配置:哪些方法参与事务、隔离级别、超时时间等
事务的本质是什么
@Transactional 仅仅是一个事务元数据、声明试事务主要通过 Spring AOP来实现,做为一个拦截器,包括方法调用前、调用后来完成。
事务不生效的几种可能:
方法不是public的
自己catch了异常
数据库引擎不支持事务
BeanFactory和FactoryBean的区别
BeanFactory ,是IOC容器最底层接口,是负责生产和管理Bean的一个工厂接口,提供Spring IOC的容器规范。
FactoryBean:创建Bean的一种方式,是对Bean的一种扩展,是对复杂对象 初始化创建的过程。