1. Spring
1.1 什么是Spring
答:Spring是一个企业级应用的开源框架,主要用来开发java应用。Spring框架的目标是简化Java企业级应用开发。
1.2 Spring框架的好处
答:
1、轻量:Spring是轻量级的
2、控制反转:Spring通过控制反转实现了松耦合,对象给出他们的依赖,而不是创建或查找依赖的对象们
3、面向切面编程:Spring支持面向切面的编程,并且把应用业务逻辑和系统分开
4、容器:Spring包含并管理应用中对象的生命周期和配置
5、MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架一个很好的替代品
6、事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务
7、异常处理:Spring提供方便的API把具体技术相关的异常转化为一直的unchecked异常
1.3 Spring由哪些模块组成
答:
IOC
DAO
MVC
AOP
ORM
1.4 Spring有哪些不同的组件
答:
1、接口-定义功能
2、bean类-包含属性、setter和getter方法、函数等
3、AOP-提供面向切面编程功能
4、bean配置文件-包含类的信息以及如何配置他们
5、用户程序-它使用接口
1.5 什么是SpringBean?
答:SpringBean是构成应用程序主干的对象,Bean基于用户提供给容器的配置元数据创建(例如xml文件、基于注解的配置、基于java的配置),由Spring IoC容器统一管理、实例化、配置、装配。
1.6 Spring Bean的生命周期
答:
总的来说有四个
-
1、实例化 Instantiation
-
2、属性赋值 Populate
-
3、初始化 Initialization
-
4、销毁 Destruction
具体来说:
-
实例化bean:Spring容器根据配置中的bean定义实例化bean
-
设置对象属性:Spring使用依赖注入填充所有的属性
-
处理Aware接口:
-
若bean实现了BeanNameAware接口,则工厂通过传递bean的id来调用setBeanName()
-
若bean实现了BeanFactoryAware接口,工厂通过传递自身的实例来调用setBeanFactory()BeanPostProcessor:
-
若存在于bean关联的任何BeanPostProcessor,则调用preProcessorBeforeInitilization()方法
-
-
Init:
-
若bean指定了init方法,那么将调用它
-
-
BeanPostProcessors
-
如果存在与bean关联的BeanPostProcessors,则将调用postProcessorAfterInitialization()方法
-
-
DisposableBean:
-
如果bean实现DisposableBean接口,当容器关闭时,会调用
-
-
destory()
-
如果为bean指定了destory方法,那么将调用它
-
1.7 SpringBean支持的几种bean的作用域
答:
-
1、singleton:(默认的)在每个Spring IoC容器中,一个bean定义对应只会有唯一的一个bean实例。
-
2、prototype:为每一个bean请求提供一个实例
-
3、request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
一个bean定义对应于单个HTTP 请求的生命周期。也就是说,每个HTTP 请求都有一个bean实例,且该实例仅在这个HTTP 请求的生命周期里有效。该作用域仅适用于WebApplicationContext环境。
-
4、session:与request范围类似,确保每个session中有一个bean实例,在session过期后,bean会随之失效。
一个bean 定义对应于单个HTTP Session 的生命周期,也就是说,每个HTTP Session 都有一个bean实例,且该实例仅在这个HTTP Session 的生命周期里有效。该作用域仅适用于WebApplicationContext环境。
-
5、 global-session:全局作用域,global-session和Protolet应用相关。当应用部署在portlet容器中工作时,它包含很多portlet。如果想要声明让所有的portolet公用全局的存储变量的话,那么全局变量需要存储在global-session中。全局作用域与servlet中的session作用域效果相同。
1.8 什么是 Spring容器
答:Spring框架的核心就是Spring容器,容器创建对象,将它们装配到一起,配置他们并管理他们的完整生命周期 Spring容器使用依赖注入来管理组成应用程序的组件,容器通过读取提供的配置元数据来接收对象进行实例化,配置和组装的命令。该元数据可以通过XML、java注解、java代码提供
1.9 Spring 有多少种IOC容器
答:BeanFactory:它会在客户端要求时实例化bean ApplicationContext:扩展了BeanFactory接口,它在BeanFactory基础上提供了一些额外功能。
1.10 什么是控制反转
答:IOC (Inversion Of Control)。它将对象交给了容器管理,开发者只需要在spring配置文件中配置相应的bean以及设置相应的属性,让spring容器来生成类的实例对象以及管理对象。
1.11 Ioc的好处
答:
-
最小化程序中的代码量
-
使程序易于测试
-
松耦合
-
支持即时实例化和延迟加载服务
1.12 Spring IOC容器实现机制
答:实现原理是工厂模式加反射机制
1.13 什么是依赖注入?
答:把需要的组件值设置到合适位置的过程叫依赖注入。
1.14 依赖注入的方式有哪几种?优缺点是什么
答:通常,依赖注入有三种方式,分别是:构造器注入,setter注入,接口注入。
-
构造器注入:将被依赖对象通过构造函数的参数注入给依赖对象,并且在初始化对象的时候注入
-
优点:对象初始化完成后便可获得可使用的对象
-
缺点:当需要注入的对象很多时,构造器参数列表会很长;不够灵活。若有多种注入方式,每种方式秩序注入指定几个依赖,那么就需要提供多个重载的构造函数
-
-
Setter注入:通过调用成员变量提供的setter函数将被依赖对象注入给依赖类
-
优点:灵活,可以选择性的注入需要的对象
-
缺点:依赖对象初始化完成后由于尚未注入被依赖对象,因此还不能使用
-
-
接口注入:依赖类必须实现指定的接口,然后实现该接口中的一个函数,该函数就是用于依赖注入。该函数的参数就是要注入的对象
侵入行:如果A类要是用别人提供的一个功能,若为了使用这功能,需要在自己的类中增加额外的代码,这就是侵入行
-
优点:接口注入中,接口的名字、函数的名字都不重要,只要保证函数的参数是要注入的对象类型即可
-
缺点:侵入行太强
-
1.15 什么是AOP
答:AOP是面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为切面(Aspect),减少系统中重复的代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理
1.16 AOP的原理是什么
答:在使用 AOP 之后,Spring 容器返回的目标对象已经发生了改变,是采用动态 代理技术生成的一个子类对象。子类对象将父类方法进行了重写,重写方法中调 用父类原有功能+切入的组件功能。动态代理技术:JDK Proxy API 技术、CGLIB 技术。
1.17 什么是切点
程序运行中的一些时间点,例如一个方法的执行,或是一个异常的处理。在Spring AOP 中, join point总是方法的执行点。
1.18 什么是通知
答:特定的join point 出的Aspect所采用的动作称为Advice。Spring AOP 使用一个Advice作为拦截器, 在Join point 周围维护一系列的拦截器。
1.18 通知的类型有哪些
答:
1、Before – 在join point 方法之前执行 @Before注解进行配置
2、After Returning – 在切点方法正常执行后执行,@AfterReturning注解配置
3、After Throwing – 仅在join point方法通过抛出异常并退出时执行,@AfterThrowing
4、After(finally)- 在切点方法后执行,无论方法退出是正常还是异常返回,都可以执行,使用@After注解配置
5、Around – 在切点之前和之后执行,使用@Around注解进行配置
.19 什么是自动装配
答:当bean在Spring容器中组合在一起时,它被称为装配或bean装配。Spring容器能够自动装配相互合作的bean,这意味着容器不需要配置,能通过bean工厂自动处理bean之间的协作。
1.20 自动装配的方式
答:一共有5中装配方式
-
no :默认的方式,不进行自动装配,通过显示设置ref属性来进行装配。
-
byName:通过参数名自动装配,Spring容器在配置文件中发现bean的 autowire 属性被设置成byName,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
-
byType:通过参数类型自动装配,Spring容器在配置文件中发现bean的 autowire 属性被设置成byType,之后的容器试图匹配、装配和该bean的属性具有相同的类型的bean。如果有多个符合条件,则抛出错误。
-
constructor:类似byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,抛出异常。
-
autodetect:首先尝试contructor来自动装配,如果无法工作,则使用byType方式。
1.21 自动装配的局限性
答:
-
重写:仍需用和配置来定义依赖,这意味着总要重写自动装配。
-
基本数据类型:你不能自动装配简单的属性,如:基本数据类型,String字符串 和 类。
-
模糊特性:自动装配不如现实装配精确,如果有可能,建议使用显示装配。
1.22 @component、@Controller、@Service、@Respository的区别
答:
-
@Component :通用层注解,将java类标记为bean。它是任何Spring管理组件的通用构造型,Spring的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。
-
@Controller:控制层注解,将一个类标记为 Controller 控制器,标有它的bean会自动导入到IOC容器中。
-
@Service:服务层注解,主要用于服务层的类中,更好的指定意图,类似@Component。
-
@Respository:持久层注解,主要用于DAO层,他将DAO导入到容器, 类似@Component,使未经检查的异常有资格转换为SpringDataAccessException。
1.23 Autowired 和 Resource 的区别
答:
-
共同点:都可以卸载字段和setter方法上,如果写在字段上,那么就不需要再写setter方法。
-
不同点:
-
1、默认按照byName自动注入
-
2、有两个重要属性:name 和 type,Spring将其name属性解析为bean的名字,type属性解析为bean的类型。若既不定制name也不定制type,这时将通过反射机制使用byName自动注入
-
3、@Resource装配顺序
-
同时指定name和type,则从Spring上下文中找到唯一配配的bean进行装配,找不到则抛出异常
-
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
-
如果指定了type,则从上下文中找到类似的唯一bean进行装配,找不到或是找到多个,都会跑出异常
-
既没指定name,有没指定type,则按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
-
1、Spring提供的注解,需要导包
-
2、按照类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果想是其按照名称来装配,可以结合@Qualifier一起使用。
-
@Autowired:
-
@Resource
-
一般情况下@Autowired 和 @Resource作用相同
1.24 SpringMVC是什么
答:
-
MVC设计模式是一种常用的软件架构方式:
-
V - View:视图层,为用户提供UI重点关注数据的呈现;
-
M - Model:模型层,业务数据的信息表示,关注支撑业务的信息构成,通常是多个业务实体的组合;
-
C - Controller:控制层,调用业务逻辑产生合适的数据(Model),传递数据给视图层用于呈现。
-
-
MVC的核心思想(本质)是业务数据抽取同业务数据呈现相分离
-
SpringMVC是一个基于MVC的web框架,属于Spring中的一个模块,它和Spring不需要通过中间层进行整合就可以一起使用。
1.25 SpringMVC的流程
答:
-
1.发起请求到前端控制器(DispatcherServlet) - 2.前端控制器请求HandlerMapping查找Handler,可根据xml文件配置或者注解进行查找。- 3.处理器映射器HandlerMapping向前端控制器返回Handler。- 4.前端控制器调用处理器适配器去执行Handler。- 5.处理器适配器去执行Handler。- 6.Handler执行完给适配器返回ModelAndView。- 7.处理器适配器给前端控制器返回ModelAndView。ModelAndView是SpringMVC框架的一个底层对象,包括Model和View。- 8.前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图。- 9.视图解析器向前端控制器返回view。- 10.前端控制器进行视图渲染,将模型数据(ModelAndView对象中)填充到request域中。- 11.前端控制器向用户响应结果
1.26 SpringMVC框架有什么用
答:SpringMVC 框架提供 模型-视图-控制器 架构 和 随时可用的组件,用于开发灵活且松散耦合的web应用。MVC模式有助于分离应用程序的不同方面,如:输入逻辑、业务逻辑和UI逻辑,同时在所有这些元素之间提供松散耦合。
1.27 SpringMVC 常用的注解有哪些
答:
-
@RequestMapping:用于处理请求url映射的注解,可用于类或方法上。用于类上,则表示类中的所有响应请求的方法都是以该地址作为父路径。
-
@ReruestBody:实现接收http请求的Json数据,将Json转换为Java对象。
-
@ResponseBody:将Controller方法返回对象转化为Json对象响应给客户。
1.28 Spring 支持的ORM
答:
-
Hibernate
-
Mybatis
-
JPA(Java Persistent API)
-
JDO(Java Data Object)
-
OJB
-
TopLink
1.29 spring支持的事务类型
答:两种
-
1、程序化事务管理:在此过程中,在编程帮助下管理实务,灵活、维护困难
-
2、声明式事务管理:事务管理和业务代码分离。仅适用注解或基于xml的配置来管理事务。