spring面试题

来源:互联网 发布:阶乘递归算法 编辑:程序博客网 时间:2024/06/07 14:52

1.什么是Spring?

答:spring的核心是一个轻量级的容器(Container,它是实现IoC(Inversion of Control)容器和非侵入性(No intrusive)的框架,并提供AOP(Aspect-oriented Programming)的实现方式,提供对持久层(Persistence)、事务(Transcation)的支持;提供MVC Web框架的实现,并对一些常用的企业服务API提供了一致的模型封装,是一个全方位的应用程序框架,除此之外,对现存的各种框架(Structs、JSF、hibernateIbatis、Webwork等),Spring也提供了与他们相整合的方案。 
细化: 
1、Spring的核心是一个轻量级(Lightweight)的容器(Container)。 
2、Spring是实现IoC(Inversion of Control)容器和非入侵性(No intrusive)的框架。 
3、Spring提供AOP(Aspect-oriented programming)的实现方式,把应用业务逻辑和系统服务分开。 
4、Spring提供对持久层(Persistence)、事物(Transcation)的支持。 
5、SpringMVC Web框架的实现,并对一些常用的企业服务API(Application Interface)提供一致的模型封装。 
6、Spring提供了对现存的各种框架(Structs、JSF、Hibernate、Ibatis、Webwork等)相整合的方案。 
总之,Spring是一个全方位的应用程序框架。

2.IoC/DI(控制反转/依赖注入): 
1)控制反转可以分开来解读,控制和反转-> 控制指的是程序中的一些对象或者变量的控制权,在传统的程序中都是由应用程序自己控制对象创建或者变量赋值,这是一种主动式的控制,导致组件之间的完全耦合;现在将一些对象或者变量的创建控制权交给一个叫做Ioc容器的东西,由这个容器来控制应用程序中所需要的资源,这样就变成了被动的控制,对组件之间的关系进行解耦,所以所谓的反转就是将控制权由应用程序转交到Ioc容器。 
2)依赖注入:同样将DI分开来解读,依赖和注入-> 其实应用程序中所需要的资源创建和获取都是要依赖于Ioc容器,需要IoC容器装配类之间的关系,即应用程序依赖于IoC容器的装配功能;相反,注入就是IoC容器向应用程序中进行注入应用程序所需要的资源,由应用程序主动装配对象的依赖变应用程序被动接受依赖,所以IoC容器也叫DI容器。

控制权的主动与被动式其实都是相对于IoC容器来说的,也可以将IoC模式看做是工厂模式的升华,不同的是Spring中的控制反转所用到的是Java“反射”技术,通过在XML文件中定义应用程序所需要的类,再由IoC容器根据xml文件创建类的实例。将对象生成放到xml文件中,如果我们想要换一个实现的类将变得很简单,只需要修改xml文件即可。

3.Aop面向切面编程

面向对象的延续。它将系统中非核心的业务提取出来,进行单独处理。比如事务、日志等,它可以实现“业务代码”与“关注点代码”分离。这个简单来说就是可以在一段程序之前或者之后做一些事。

实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为;二是采用静态织入的方式,引入特定的语法创建“切面”,从而使得编译器可以在编译期间织入有关“切面”的代码,属于静态代理

Aop  aspect object programming  面向切面编程

功能: 让关注点代码与业务代码分离!

关注点,

重复代码就叫做关注点;

切面,

 关注点形成的类,就叫切面()

 面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候业务方法上动态植入“切面类代码”。

切入点,

执行目标对象方法,动态植入切面代码。

可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。

5.Spring中设计模式

Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:

代理模式—在AOP和remoting中被用的比较多。单例模式—在spring配置文件中定义的bean默认为单例模式。

模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。

前端控制器—Srping提供了DispatcherServlet来对请求进行分发。

视图帮助(View Helper )—Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。

依赖注入—贯穿于BeanFactory / ApplicationContext接口的核心理念。工厂模式—BeanFactory用来创建对象的实例。

6.什么是Spring Beans?

Spring Beans是构成Spring应用核心的Java对象。这些对象由Spring IOC容器实例化、组装、管理。这些对象通过容器中配置的元数据创建,例如,使用XML文件中定义的创建。

7.Spring Bean中定义了什么内容?

Spring Bean中定义了所有的配置元数据,这些配置信息告知容器如何创建它,它的生命周期是什么以及它的依赖关系。

8.如何向Spring 容器提供配置元数据?

有三种方式向Spring 容器提供元数据:

XML配置文件 基于注解配置 基于Java的配置

9.你如何定义bean的作用域?

Spring中创建一个bean的时候,我们可以声明它的作用域。只需要在bean定义的时候通过’scope’属性定义即可。例如,当Spring需要产生每次一个新的bean实例时,应该声明bean的scope属性为prototype。如果每次你希望Spring返回一个实例,应该声明bean的scope属性为singleton。

10.说一下Spring中支持的bean作用域

Spring框架支持如下五种不同的作用域:

singleton:在Spring IOC容器中仅存在一个Bean实例,Bean以单实例的方式存在。prototype:一个bean可以定义多个实例。

request:每次HTTP请求都会创建一个新的Bean。该作用域仅适用于WebApplicationContext环境。

session:一个HTTP Session定义一个Bean。该作用域仅适用于WebApplicationContext环境.

globalSession:同一个全局HTTP Session定义一个Bean。该作用域同样仅适用于WebApplicationContext环境.

bean默认的scope属性是’singleton‘。

11.Spring框架中单例beans是线程安全的吗?

不是,Spring框架中的单例beans不是线程安全的。

12.解释Spring框架中bean的生命周期

1)spring对bean进行实例化,默认bean是单例

2)spring对bean进行依赖注入

3)如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法

4)如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来

5)如果bean实现了ApplicationContextAware()接口,spring将调用setApplicationContext()方法将应用上下文的引用传入

6) 如果bean实现了BeanPostProcessor接口,spring将调用它们的postProcessBeforeInitialization接口方法

7) 如果bean实现了InitializingBean接口,spring将调用它们的afterPropertiesSet接口方法,类似的如果bean使用了init-method属性声明了初始化方法,改方法也会被调用

8)如果bean实现了BeanPostProcessor接口,spring将调用它们的postProcessAfterInitialization接口方法

9)此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁

10)若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用

13.哪些是最重要的bean生命周期方法?能重写它们吗?

bean标签有两个重要的属性(init-method 和 destroy-method),你可以通过这两个属性定义自己的初始化方法和析构方法。

14.什么是Spring的内部bean?

当一个bean被用作另一个bean的属性时,这个bean可以被声明为内部bean。在基于XML的配置元数据中,可以通过把元素定义在 或元素内部实现定义内部bean。内部bean总是匿名的

15.Spring框架中的单例Beans是线程安全的么?

Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”

16.怎样用注解的方式配置Spring?

Spring在2.5版本以后开始支持用注解的方式来配置依赖注入。可以用注解的方式来替代XML方式的bean描述,可以将bean描述转移到组件类的内部,只需要在相关类上、方法上或者字段声明上使用注解即可。注解注入将会被容器在XML注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。注解装配在Spring中是默认关闭的。所以需要在Spring文件中配置一下才能使用基于注解的装配模式。

17.BeanFactory 和ApplicationContext的区别

1. 首先BeanFactory和ApplicationContext都是接口,并且ApplicationContext是BeanFactory的子接口。

2. 其次BeanFactory是Spring中最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能, 
ApplicationContext(应用上下文)它是Spring的一个更高级的容器,提供了更多的有用的功能; 
1)ApplicationContext继承了BeanFactory接口,所以,ApplicationContext也能像BeanFactory从容器中得到Bean(继承至 ListableBeanFactory); 
2)ApplicationContext提供的额外的功能: 
国际化的功能,消息发送、响应机制(继承至MessageSource );统一加载资源的功能(继承至ResourceLoader);强大的事件机制( 继承至ApplicationEventPublisher);对Web应用的支持()

3. 它们的加载方式不同: 
1) BeanFactory采用的是延迟加载的形式来注入Bean,即只有在使用某个bean的时候,才对该Bean进行加载实例化.好处是节约内存,缺点是速度比较慢. 
2) ApplicationContext则相反的,它是在Ioc容易启动时就一次性创建所有的Bean,这样的好处是可以马上发现Spring配置文件中的错误。坏处就是浪费内存。

ApplicationContext的三种较常见的实现方式: 
1) ClassPathXmlApplicationContext:从classpath的xml配置文件中读取上下文,并生成上下文定义,应用程序上下文从程序环境中取得。

ApplicationContext context =new ClassPathXmlApplicationContext("****.xml");

2) FileSystemXmlApplicationContext:由文件系统中的xml配置文件读取上下文。

ApplicationContext context =new FileSystemXmlApplicationContext("****.xml");

3) XmlWebApplicationContext:由Web应用的Xml文件读取上下文。

原创粉丝点击