面试题系列- Spring
Posted 学不停后端
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题系列- Spring相关的知识,希望对你有一定的参考价值。
1、什么是 Spring 框架?Spring 框架有哪些主要模块?
2、使用 Spring 框架能带来哪些好处?
1.依赖注入,将对象的创建交由容器管理
2.提供了方便解决方案,MVC、事务、定时器等
3、什么是控制反转(IOC)?什么是依赖注入?
IOC控制反转这种设计思想,交由容器管理对象的创建,而不是对象内部去控制对象的创建。而反转就是由原先的对象控制对象的创建改为容器控制创建,这就是反转。
而DI依赖注入是由容器管理对象之间的依赖关系,当确定这种关系后,IOC容器就可以动态的对对象的创建做控制。
IOC/DI带来的方便是容器可以控制对象的服用以及管理对象间的依赖关系。
4、BeanFactory 和 ApplicationContext 有什么区别?
Spring的代码设计高度接口化,BeanFactory接口提供了获取容器中bean的方法。而ApplicationContext是BeanFactory的子类,对BeanFactory进行了增强,提供容器上下文获取的方法,同时继承了其他的接口类。
BeanFactory:在初始化容器时并不会创建bean实例,只有getBean时才会创建
ApplicationContext:在初始化时就创建了单例的Bean实例。
5、Spring 有几种配置方式?
XML、注解、JAVA类
6、如何用基于 XML 配置的方式配置 Spring?
8、如何用基于 Java 配置的方式配置 Spring?
9、怎样用注解的方式配置 Spring?
10、请解释 Spring Bean 的生命周期?
beandefinnition->XXXAware->beanPostProcessor->beforeInit->init->afterInit-> destory->custom destory
11、Spring Bean 的作用域之间有什么区别?
作用域包括:
singleton:单例模式,全局只有一个实例
prototype:原型模式,每次调用产生一个新的实例
在web使用的时候还有三个作用域,但是必须在web.xml中注册一个RequestContextListener , 目的是为了设置每次请求开始和结束都可以使spring得到相应的事件。
request:每次请求产生一个bean
session:每个用户session可以产生一个新的bean,不同用户之间的bean互相不影响
globalSession:作用和session类似,只是使用portlet的时候使用。
12、什么是 Spring inner beans?
在Spring框架中,无论何时bean被使用时,当仅被调用了一个属性。一个明智的做法是将这个bean声明为内部bean。内部bean可以用setter注入“属性”和构造方法注入“构造参数”的方式来实现。
13、Spring 框架中的单例 Beans 是线程安全的么?
对于spring bean分singleton和prototype。prototype是线程安全的,而对于singleton,如果bean是有状态的则不能保证线程安全,无状态的bean还是线程安全的。
14、请举例说明如何在 Spring 中注入一个 Java Collection?
15、如何向 Spring Bean 中注入一个 Java.util.Properties?
16、请解释 Spring Bean 的自动装配?
IOC容器管理bean之间的依赖关系,通过autowire完成自动装配。
17、请解释自动装配模式的区别?
自动装配有三种设置,byName:通过bean名称获取bean注入、byType:通过类名获得bean注入、No:默认方式
18、如何开启基于注解的自动装配?
<context:annotation-config />
19、请举例解释@Required 注解?
IoC容器可能声明了数十万了bean,bean与bean之间有着复杂的依赖关系。设值注解方法的短板之一就是验证所有的属性是否被注解是一项十分困难的操作。可以通过在<bean>中设置 “dependency-check” 来解决这个问题。
在应用程序的生命周期中,你可能不大愿意花时间在验证所有bean的属性是否按照上下文文件正确配置。或者你宁可验证某个bean的特定属性是否被正确的设置。即使是用 “dependency-check” 属性也不能很好的解决这个问题,在这种情况下,你需要使用@Required 注解。RequiredAnnotationBeanPostProcessor是Spring中的后置处理用来验证被@Required 注解的bean属性是否被正确的设置了。
20、请举例解释@Autowired 注解?
可以在设值方法上使用@Autowired注解来替代配置文件中的 元素。当Spring容器在setter方法上找到@Autowired注解时,会尝试用byType 自动装配。
21、请举例说明@Qualifier 注解?
当IOC容器中存在多个相同Class的bean时,使用Qualifier来指定使用哪个具体的bean。
22、构造方法注入和设值注入有什么区别?
相比而言设置注入具有以下优点:
1)与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受。通过setter方法设定依赖关系显得更加直观、自然。
2)对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设置注入可以避免这些问题。
3)尤其在某些属性可选的情况下,多参数的构造器更加笨重。
某些情况下,构造注入的优势:
1)构造注入可以在构造器中决定依赖关系的注入顺序,有限依赖的优先注入。例如,组件中其它依赖关系的注入,常常需要依赖于Datasource的注入。采用构造注入,可以在代码中清晰地决定注入顺序。
2)对于依赖关系无需变化的Bean,构造注入更加有用。因为没有setter方法,所有的依赖关系全部在构造器内设定。因此,无需担心后续代码对依赖关系的破坏。
3)依赖关系只能在构造器中设定,则只有组建的创建者才能改变组建的依赖关系。对组建的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。
23、Spring 框架中有哪些不同类型的事件?
Spring 提供了以下5种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的refresh()方法时被触发。
(2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的Start()方法开始/重新开始容器时触发该事件。
(3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的Stop()方法停止容器时触发该事件。
(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。容器被关闭时,其管理的所有单例Bean都被销毁。
(5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件。
如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知。
24、FileSystemResource 和 ClassPathResource 有何区别?
在 FileSystemResource 中需要给出 spring-config.xml 文件在你项目中的相对路径或者 绝对路径。在 ClassPathResource 中 spring 会在 ClassPath 中自动搜寻配置文件,所以要把 ClassPathResource 文件放在 ClassPath 下。如果将 spring-config.xml 保存在了 src 文件夹下的话,只需给出配置文件的名称即可,因为 src 文件夹是默认。简而言之,ClassPathResource 在环境变量中读取配置文件,FileSystemResource 在配置文件中读取配置文件。
25、Spring 框架中都用到了哪些设计模式?
工厂、单例、代理、装饰者、观察者、模板、适配器模式Adapter
以上是关于面试题系列- Spring的主要内容,如果未能解决你的问题,请参考以下文章