职场面试题总结(36)---Bean工厂和Applicationcontexts有什么区别、Spring的依赖注入、依赖注入方式、Springbeans

153 阅读5分钟

1、Bean工厂和Applicationcontexts有什么区别?

Applicationcontexts提供一种方法处理文本消息,一个通常的做法是加载文件资源(比如镜像),它们可以向注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Applicationcontexts中以声明的方式处理。Applicationcontexts实现了MessageSource接口,该接口的实现以可插拔的方式提供获取本地化消息的方法。

2、一个Spring的应用看起来像什么?

 一个定义了一些功能的接口。
   这实现包括属性,它的Setter,getter方法和函数等。
   SpringAOP。
   Spring的XML配置文件。
   使用以上功能的客户端程序。

3、Spring的依赖注入

依赖注入,是IOC的一个方面,是个通常的概念,它有多种解释。这概念是说你不用创建对象,而只需要描述它如何被创建。你不在代码里直接组装你的组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。

4、有哪些不同类型的IOC(依赖注入)方式

1) 构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
  
 (2) Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

5、建议使用哪种依赖注入方式,构造器注入,还是Setter方法注入?

两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

6、Springbeans是什么?

Springbeans是那些形成Spring应用的主干的java对象。它们被SpringIOC容器初始化,装配,和管理。这些beans通过容器中配置的元数据创建。比如,以XML文件中<bean/>的形式定义。

Spring框架定义的beans都是单件beans。在beantag中有个属性”singleton”,如果它被赋为TRUE,bean就是单件,否则就是一个prototypebean。默认是TRUE,所以所有在Spring框架中的beans缺省都是单件。

7、一个SpringBean定义包含什么?

一个SpringBean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖。

8、如何给Spring容器提供配置元数据?

这里有三种重要的方法给Spring容器提供配置元数据。

XML配置文件。

基于注解的配置。

基于java的配置。

9、你怎样定义类的作用域?

当定义一个<bean>在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean定义中的scope属性来定义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope属性必须设为singleton。

10、解释Spring支持的几种bean的作用域

Spring框架支持以下五种bean的作用域:

singleton:

bean在每个Springioc容器中只有一个实例。

prototype:

一个bean的定义可以有多个实例。

request:

每次http请求都会创建一个bean,该作用域仅在基于web的SpringApplicationContext情形下有效。

session:

在一个HTTPSession中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。

global-session:

在一个全局的HTTPSession中,一个bean定义对应一个实例。该作用域仅在基于web的SpringApplicationContext情形下有效。

缺省的Springbean的作用域是Singleton。

11、Spring框架中的单例bean是线程安全的吗?

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

12、Spring框架中bean的生命周期

Spring容器从XML文件中读取bean的定义,并实例化bean。

Spring根据bean的定义填充所有的属性。

如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。

如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。

如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。

如果有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization()方法将被调用。

如果bean实现了DisposableBean,它将调用destroy()方法。

12、哪些是重要的bean生命周期方法?你能重载它们吗?

有两个重要的bean生命周期方法,第一个是setup,它是在容器加载bean的时候被调用。第二个方法是teardown它是在容器卸载类的时候被调用。

Thebean标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。

13、什么是Spring的内部bean?

当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义innerbean,在Spring的基于XML的配置元数据中,可以在<property/><constructor-arg/>元素内使用<bean/>元素,内部bean通常是匿名的,它们的Scope一般是prototype。

14、在Spring中如何注入一个java集合?

Spring提供以下几种集合的配置元素:

<list>类型用于注入一列值,允许有相同的值。

<set>类型用于注入一组值,不允许有相同的值。

<map>类型用于注入一组键值对,键和值都可以为任意类型。

<props>类型用于注入一组键值对,键和值都只能为String类型。