面试题一Spring
-
Spring是什么?
Spring是一个轻量级的IOC和AOP容器框架,是为Java应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。常见的配置方式有三种:基于XML的配置、基于注解的配置、基于Java的配置
-
Spring主要由几个模块组成?
AOP:
Core:核心库,提供IOC服务
Context:提供框架式的Bean访问方式
DAO:对JDBC的抽象,简化数据访问异常的处理
ORM:
Web:
MVC:Model-View-Controller
-
对Spring的AOP怎么理解?
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块并命名为“切面”(Aspect)。减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。
AOP的实现关键在于代理模式。AOP代理主要分为静态代理和动态代理,动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。
JDK动态代理:基于接口实现
局限:很多类没有实现接口,那么就没办法实现代理
CGLIB动态代理:基于继承思想
作用:针对没有实现接口的类,进行代理
总结:与jdk提供的代理区别:Proxy:委托类必须有接口,制作过程比较快,执行慢。CGLIB:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快。
-
对Spring的IOC怎么理解?
IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机都是自己把控,而现在这种权力转移给Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
Spring的IOC有三种注入方式:
- Set注入
- 构造器注入
- 基于注解注入
-
请解释Spring Bean的生命周期?
首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destory。
Spring bean的生命周期:
Spring容器从xml文件中去读bean的定义并实例化bean
Spring根据bean的定义填充所有属性
如果bean实现beanNameAware接口,spring传递bean的ID到setBeanName方法
如果bean实现了beanFactoryAware接口,spring传递beanfactory给setBeanactory方法
如果有任何与bean相关联的beanPostProcessors,spring会在
postProcesserBeforeInitialization()方法内调用它们。
如果bean实现intializingbean了,调用它的afterpropertyset方法如果bean生命了初始化方法,调用此初始化方法。
如果有beanpostprocessors和bean关联,这些bean的
postprocessafterinitialization方法将被调用
如果bean实现了disposablebean,它将调用destroy()方法
-
解释一下Spring AOP里面的几个名词:
(1)切面(Aspect):被抽取的公共模块,可能会横切多个对象。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @AspectJ 注解来实现。
(2)连接点(Join point):指方法,在Spring AOP中,一个连接点 总是 代表一个方法的执行。
(3)通知(Advice):在切面的某个特定的连接点(Join point)上执行的动作。通知有各种类型,其中包括“around”、“before”和“after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截器链。
(4)切入点(Pointcut):切入点是指 我们要对哪些Join point进行拦截的定义。通过切入点表达式,指定拦截的方法,比如指定拦截add*、search*。
(5)引入(Introduction):(也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。
(6)目标对象(Target Object): 被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做 被通知(adviced) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个 被代理(proxied) 对象。
(7)织入(Weaving):指把增强应用到目标对象来创建新的代理对象的过程。Spring是在运行时完成织入。
切入点(pointcut)和连接点(join point)匹配的概念是AOP的关键,这使得AOP不同于其它仅仅提供拦截功能的旧技术。 切入点使得定位通知(advice)可独立于OO层次。 例如,一个提供声明式事务管理的around通知可以被应用到一组横跨多个对象中的方法上(例如服务层的所有业务操作)。