详细描述什么是Spring?
Spring 的核心是一个轻量级(Lightweight)的容器(Container)。
Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。
Spring提供AOP(Aspect-oriented programming)概念的实现方式。
Spring提供对持久层(Persistence)、事物(Transcation)的支持。
Spring供MVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。
Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。
什么是Spring IOC?
SpringIOC 负责创建对象,管理对象(通过依赖注入),装配对象,配置对象,并且管理这些对象的整个生命周期
控制反转(Inversion of Control,缩写为IoC):组件以一些预定好的方式接收来自容器的资源注入。
依赖注入: 在应用程序中的组件需要获取资源时,传统的方式是组件主动去创建需要的资源;反转控制的思想完全颠覆了应用程序组件获取资源的方式,反转了资源的获取方向,改由容器创建,并主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可。
什么是Spring AOP?描述其应用场景(最少2个)
AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。
它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
应用场景: 权限认证、通知、日志、事务处理
AOP的通知有几个,分别是什么
@Before:前置通知,在调用目标方法之前执行通知定义的任务
@After:后置通知,在目标方法执行结束后,无论执行结果如何都执行通知定义的任务
@After-returning:在目标方法返回后执行,执行成功之后
@After-throwing:异常通知,如果目标方法执行过程中抛出异常,则执行通知定义的任务
@Around:环绕通知,在目标方法执行前和执行后,都需要执行通知定义的任务。
描述Spring Bean的作用域?
singleton : 在IOC容器中只存在一个bean实例。bean以单例方式存在
prototype: 每次从容器中调用bean时都返回一个新的实例
request: 每次http请求都会创建一个新的bean
session:同一个session共享一个bean,不同的session使用不同的bean
global-session: 一般用于Protlet
Spring Bean 注入有几种方式?
- set方法注入
- 构造器注入
- 静态工厂注入
- 实例工厂注入
SpringBean 生命周期?
- 实例化BEAN Instantiation(默认)
- 设置属性赋值 Populate(默认)
- 前置处理器(开发人员自定义方法)
- 初始化 Initialization (init (开发人员自定义方法))
- 后置处理器(开发人员自定义方法)
- 使用BEAN(默认)
- destory(开发人员自定义方法)
- 销毁BEAN Destruction(默认)
Spring框架中 用到了哪些设计模式?(不低于3个)
1.工厂设计模式 : Spring使用工厂模式通过 BeanFactory、 ApplicationContext 创建 bean 对象。
2.代理设计模式 : Spring AOP 功能的实现。
3.单例设计模式 : Spring 中的 Bean 默认都是单例的。
4.模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
5.包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
6.观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
7.适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
描述Spring事务传播行为?
①PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
② PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
③ PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
④ PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
⑤ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操yu作,如果当前存在事务,就把当前事务挂起。
⑥ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
⑦ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行
描述Spring事务的隔离级别?
默认级别: 默认和数据库保持一样的隔离级别。
1.读未提交:READ_UNCOMMITTED:就是一个事务可以读取另一个未提交事务的数据。
2.读已提交:READ_COMMITTED:就是一个事务要等另一个事务提交后才能读取数据,可以避免脏读。
3.重复读:REPEATABLE_READ:就是在开始读取数据(事务开启)时,不再允许修改操作,可以避免脏读,不可重复读。
4.串行化:SERIALIZABLE:最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
Spring事务传播行为 REQUIRED和REQUIRED_NEW区别
REQUIRES:当前方法被另一个事务方法调用时合并成一个事务;
REQUIRES_NEW:当前方法必须启动一个新事务并在自己的事务内运行,若有事务在运行则将它挂起