目录
2. Spring,Spring MVC,Spring Boot之间的关系?
4. 核心容器(Application Context)应用上下文模块
5. BeanFactory-BeanFactory实现举例
20. 说出Spring或SpringMVC常用的注解,并解释。
25. Transactional(rollbackFor = Exception.class)注解了解吗?
1. 什么是Spring框架?
Spring是一款开源的轻量级的Java开发框架,我们一般说spring框架指的是spring Framework,它是很多模块的集合,使用这些模块可以方便的协助我们开发,比如说Spring支持IOC(Inversion of Control:控制反转) 和AOP(Aspect - Oriented Programming:面向切面编程),可以很方便地对数据库进行访问,可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等),对单元测试支持较好,支持RESTful 风格 java应用程序的开发
2. Spring,Spring MVC,Spring Boot之间的关系?
很多人对Spring,SpringMVC,SpringBoot三者傻傻分不清,简单介绍一下这三者:
- Spring包含了多个功能模块,最重要的是Spring-Core(主要提供Ioc依赖注入)模块,Spring的其他模块(如SpringMVC)的功能实现基本都需要依赖于该模块。
- SpringMVC是Spring中的一个很重要的模块,主要赋予Spring快速构建MVC架构的Web程序的能力。MVC是模型(model),视图(View),控制器(Controller),其核心思想是通过将业务逻辑,数据,显示分离来组织代码
- SpringBoot只是简化了配置,如果你需要构建MVC架构的Web程序,还是需要使用SpringMVC作为MVC架构,只是SpringBoot简化了SpringMVC的很多配置,做到开箱即用!
3. 使用Spring框架的好处是什么?
轻量:Spring是轻量级的,基本的班级大约是2MB
控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
面向切面编程AOP:Spring支持面向切面编程,把应用业务逻辑和系统服务分开
容器:Spring包含并管理应用中对象的生命周期和配置
MVC框架:Spring的WEB框架是一个精心设计的框架,而MVC是WEB的一个很好的替代品
事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务
异常管理:Spring提供方便的API把具体技术相关的异常转化为一致的unchecked异常
4. 核心容器(Application Context)应用上下文模块
这是基本的Spring模块,提供Spring框架的基础功能,BeanFactory是任何以Spring为基础的应用核心,Spring框架建立在此模块上,使Spring成为一个容器。
5. BeanFactory-BeanFactory实现举例
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码分离,常用的BeanFactory实现是XMLBeanFactory类
6. IOC是什么?
IOC(Inversion Of Controller控制反转),是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由Spring框架管理。IOC在其它语言中也有应用,并非Spring特有。IOC容器是Spring用来实现IOC的载体,IOC容器实际就是一个Map(key,value),Map中存放的是各种对象。
将对象之间的相互依赖关系交由IOC容器管理,并由IOC容器完成对象的注入。这样就可以很大程度上简化应用的开发,把应用从复杂的依赖关系解放出来。IOC容器就像是一个工厂,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来,在实际项目中一个Service类可能由几百上千个类作为他的底层,假如我们需要实例化这个Service,可能每次要搞清楚这个Service所有底层类的构造函数,这可能会把人逼疯。如果利用IOC,只需要配置好,在需要的地方引用就行了,大大增加了项目的可维护性且降低了开发难度
IOC负责创建对象,管理对象(通过依赖注入DI),装配对象,配置对象,并且管理这些对象的生命周期
7. IOC有什么用?优点是什么?
作用:
- 管理对象的创建和依赖关系的维护,对象的创建并不是简单的事,在对象关系比较复杂时,如果依赖关系需要程序员维护,是很麻烦的
- 解耦,由容器去维护具体的对象。
- 托管了类的产生过程,比如我们需要在类产生过程中做一些处理,最直接的例子就是代理,如果有容器可以把这部分处理交给容器,应用程序则无序关心类是如何完成代理的
优点:
- IOC或依赖注入把应用的代码量降到最低
- 它使应用容易测试,单元测试不再需要单例和JNDI查找机制
- 最小的代价和最小的侵入性使松散耦合得以实现
- IOC容器支持加载服务时饿汉式初始化和懒加载
8. 什么是AOP?
面向切面编程,AOP是面向对象编程的一种延伸,AOP主要解决在不改变原有的业务逻辑的情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复(例如:事务处理,日志管理,权限控制)AOP是基于动态代理的,如果要代理对象,实现了某个接口,那么SpringAop就会使用JDKProxy,去创建代理对象,而对于没有实现接口的对象,无法使用JDKProxy代理了
9. 为什么叫面向切面编程?
切:指的是横切逻辑,在原有业务逻辑代码不动,只能操作横切逻辑代码
面:横切逻辑代码往往影响的是很多个方法,每个方法如同一点,多个点构成一个面。
10. 什么是SpringBeans?
SpringBeans是那些形成Spring应用的主干的java对象,它们被SpringIOC容器初始化,装配,管理。这些beans通过容器中配置的元数据创建,如,以XML文件中<bean/>的形式定义。
11. 什么是依赖注入?有什么好处?
控制反转IOC是一个很大的概念,可以用不同的方式来实现,其主要实现方式两种:依赖注入和依赖查找依赖注入:相对于IOc来说,依赖注入DI更准确的描述了IOC的设计理念,所谓依赖注入就是组件之间的依赖关系由容器在应用系统运行期决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统的各个关联的组件中。组件不做定位查询,只提供普通的java方法让容器去决定依赖关系。
好处:
- 查找定位操作与代码完全无关
- 不依赖于容器的API,可以很容易的在容器外适用对象
- 不需要特殊的接口,绝大多数对象可以做到完全不依赖容器
12. 有哪些不同类型的依赖注入实现方式?
- 依赖注入是当下最流行的方式,分为接口注入,setter方法注入,构造器注入三种方式。
- 构造器注入:构造器注入通过容器触发一个类的构造器来实现,该类有一系列的参数,每个参数代表一个对其他类的依赖。
- Setter方式注入:Setter方式注入是容器通过调用无参构造器或者无参的静态工厂方法实例化bean之后,调用该bean的stter方法,实现了基于setter的依赖注入。
13. Spring基于XML注入bean的几种方式
- Set方法注入
- 构造器注入
- 通过index设置的参数的位置注入
- 通过type设置参数类型
- 实例工厂
- 静态工厂注入
14. 怎么定义类的作用域
可以通过bean定义中的scope属性来定义。当Spring需要每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope属性必须设为singleton。
15. Spring支持哪几种bean的作用域?
Spring框架支持以下五种bean的作用域:
- singleton:bean在每个SpringIOC容器中只有一个实例。(默认)
- prototype:一个bean的定义可以有多个实例。
- request:每次http请求都会创建一个bean,该作用域仅在基于web的SpringApplicationContext有效。
- session:在http Session中,一个bean定义对应一个实例,该作用域仅在基于Web的SpringApplicationContext下有效。
- global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例,该作用域仅在基于web的SpringApplicationContext情形下有效。
16. Spring框架中的单例bean是线程安全的吗?
不是,Spring框架中的单例bean并不是线程安全的。
- spring中的bean默认是单例模式,spring框架并没有对单例bean进行多线程的封装处理。
- 实际上大部分时候springbean无状态的(如dao类),所以某种程度上来说bean也是安全的,但是如果bean有状态的话(如view model对象)那就要开发者去保证线程安全了,最简单的就是改变bean的作用域,把singleton改成prototype,这样请求bean相当于new Bean(),线程安全。
- 有状态就是由数据存储功能
- 无状态就是不会保存数据
17. Spring中bean的生命周期
默认情况下,IOC容器中的bean生命周期分为五个阶段:
- 调用构造器,或通过工厂的方式创建bean对象
- 给bean对象的属性注入值
- 调用初始化方法,进行初始化,初始化方式是通过init-method指定
- 使用
- IOC容器关闭,销毁bean对象
加入bean的后置处理器,IOCbean生命周期分为七个部分:
- 调用构造器或通过工厂方式创建bean对象
- 给bean对象属性注入值
- 执行bean前置处理器中的postProcessBeforeInitialization
- 调用初始化方法,进行初始化,初始化方式通过init-method指定
- 使用
- IOC容器关闭时,销毁bean对象。
18. 什么是bean的自动装配?
在Spring框架中,在配置文件设置bean的依赖关系是一个很好的机制,spring容i能够自动装配相互合作的bean,这意味着容器不需要和配置,就能通过bean工厂自动处理bean之间的协作。这意味着spring可以通过BeanFactory注入的方式自动搞定bean之间的依赖关系。自动装配可以设置在每个bean上,也可以设定在特定的bean上。
19. SpringMVC的工作流程
- 用户发送至前端控制器DispatcherServlet。
- DispatherServlet收到请求调用HandlerMaping处理器映射器。
- 处理器映射器找到具体的处理器,生成处理器对象以及处理器拦截器(有就生成)一并返回给DispatcherServlet。
- DispatherServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体的View。
- DispatcherServlet根据View进行渲染视图。
- DispatcherServlet响应用户。
20. 说出Spring或SpringMVC常用的注解,并解释。
@Component:基本注解,标识一个收spring管理的组件
@Controller:标识为一个表示层组件
@Service:标识为一个业务层的组件
@Repository:标识为一个持久层组件
@Autowired:自动装配
@Qualifier(" "):具体指定要装配的组件id
@RequestMapping:完成请求映射。
@PathVariable:映射请求URL中占位符到请求处理方法的形参。
@RequestBody:接受json请求参数
@RequestParam:get请求参数
@ResponseBody:相应json数据
21. 简述SpringMVC中如何返回Json数据?
- 项目中加入json转换的依赖,如jackson,fastjson,gson等
- 在请求处理方法上使用ResponseBody注解,在请求处理方法中返回值改为具体返回的数据类型,例如数据的集合类List<Employee>等。
22. Spring常用的设计模式?
- 代理模式:spring中两种代理方式,若目标对象实现了若干接口,spring使用的jdk的java lang.reflect.Proxy类代理。若目标对象没有实现任何接口,spring是哟个CGLIB库生成目标类的子类。
- 单例模式:spring的配置文件中设置bean默认为单例模式。
- 模板模式:用来解决代码重复的问题。
- 工厂模式:工厂模式中,我们创建对象时不会对客服端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。spring中使用beanFactory创建对象实例。
23. Spring事务管理方式?
- 编程式事务:在代码中硬编码。
- 声明式事务:配置文件中配置,分为:
- 基于XMl的声明式配置
- 基于注解的声明式事务
24. @Resource和AutoWired区别?
- 都是自动装配的,都可以放在属性字段上。
- @Autowired通过byType方式实现,要求这个对象必须存在!
- @Resource默认通过ByName实现,找不到名字,通过byType实现,都找不到则报错。
25. Transactional(rollbackFor = Exception.class)注解了解吗?
Exception分为运行时异常Runtime Exception和非运行时异常。事务管理对于企业至关重要,即使出现异常,它也可以保证数据一致性。
当@Transactional注解作用类上,该类所有的public方法都具备事务属性,同时我们也可以在方法级别使用该标注覆盖类级别的定义。如果类或者方法加了这个注解,那么类里面的方法抛出异常,就会回滚,数据库里的数据也会回滚。
@Transactional注解不配置rollbackFor属性那么事务只会遇见RuntimeException回滚,加上rollbackFor=Exception.class可以在非运行时异常回滚。