Java面试--Spring技术要点--Spring IOC

7  Spring IOC(依赖注入)的方式

  1. Setter方法注入
  2. 构造器方法注入
  3. 工厂方法注入(实例工厂/静态工厂)
  4. 自动装配(需要开启配置,不建议使用)

http://blessht.iteye.com/blog/1162131

8  IOC方式建议(构造器注入还是 Setter方法注入)

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

9  什么是Spring beans

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

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

10  Spring Bean定义包含什么

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

http://blog.csdn.net/yuqinying112/article/details/7245837

11  Spring容器提供配置元数据的方式

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

  1. XML配置文件。
  2. 基于注解的配置。
  3. 基于java的配置。

http://jinnianshilongnian.iteye.com/blog/1463704

12  Spring类的作用域

Spring framework支持五种作用域(其中有三种只能用在基于web的SpringApplicationContext)。

表格 2 spring scope作用域详解


singleton


在每个Spring IoC容器中一个bean定义对应一个对象实例。


prototype


一个bean定义对应多个对象实例。


request


在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会有各自的bean实例,它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。


session


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


global session


在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。

http://blog.itpub.net/25261409/viewspace-1055868/

13  Spring的单例bean是不是线程安全的

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

14  Spring中bean的生命周期

  1. Bean的建立:Spring容器从XML 文件中读取bean的定义,并实例化bean。
  2. 属性注入:Spring根据bean的定义填充所有的属性。
  3. 如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。
  4. 如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。
  5. 如果Bean实现了ApplicationContextAware接口,Spring传递applicationContext给setApplicationContext方法。
  6. 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
  7. 如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
  8. 执行Bean的init-method:可以在Bean定义文件中使用"init-method"属性设定方法名称例如:<beancalss="onlyfun.caterpillar.HelloBean"init-method="initBean">。
  9. 如果有BeanPostProcessors和bean 关联,这些bean的postProcessAfterInitialization()方法将被调用。
  10. 如果bean实现了DisposableBean,它将调用destroy()方法。
  11. 执行Bean的destroy-method:在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:<bean destroy-method="destroyBean">

http://blog.163.com/tangyang_personal/blog/static/46229613200832235353419/

15  Spring的内部bean

Spring的内部Bean在做注入时,只能用于当前的Bean属性注入,在外不可以引用。在Spring的 基于XML的 配置元数据中,可以在<property/>或<constructor-arg/> 元素内使用<bean/> 元素,内部bean通常是匿名的,它们的Scope一般是prototype。

16  Spring中注入java集合

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

  • <list>类型用于注入一列值,允许有相同的值。
  • <set>类型用于注入一组值,不允许有相同的值。
  • <map>类型用于注入一组键值对,键和值都可以为任意类型。
  • <props>类型用于注入一组键值对,键和值都只能为String类型

17  bean装配和自动装配

bean 装配:是指在Spring容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

Spring容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。

18  Spring自动装配的方式

有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。

  • no:默认的方式是不进行自动装配,通过显式设置ref属性来进行装配。
  • byName:通过参数名自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
  • byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
  • constructor:这个方式类似于byType,但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
  • autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

http://blog.csdn.net/wangli325/article/details/7471327

19  自动装配的局限性

自动装配的局限性是:

  • 重写:你仍需用<constructor-arg>和<property> 配置来定义依赖,意味着总要重写自动装配。
  • 基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串和类。
  • 模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。
时间: 2024-12-16 09:34:00

Java面试--Spring技术要点--Spring IOC的相关文章

Java面试--Spring技术要点--Spring概述

1.Spring的好处/特点 轻量:Spring是轻量的,基本的版本大约2MB. 控制反转(IOC):Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们. 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开. 容器:Spring包含并管理应用中对象的生命周期和配置. MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品. 事务管理:Spring提供一个持续的事务管理接口,可以扩展到上

Java面试--Spring技术要点--Spring AOP(面向切面编程)

33  Spring AOP的概念 面向切面的编程,是一种编程技术,是OOP(面向对象编程)的补充和完善.OOP的执行是一种从上往下的流程,并没有从左到右的关系.因此在OOP编程中,会有大量的重复代码.而AOP则是将这些与业务无关的重复代码抽取出来,然后再嵌入到业务代码当中.常见的应用有:权限管理.日志.事务管理等. 实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行:二是采用静态织入的方式,引入特定的语法创建"方面"

Java面试--Spring技术要点--Spring注解

20  基于Java的Spring注解配置(给一些注解的例子) 基于Java的配置,允许你在少量的Java注解的帮助下,进行你的大部分Spring配置而非通过XML文件. 以@Configuration注解为例,它用来标记类可以当做一个bean的定义,被SpringIOC容器使用.另一个例子是@Bean注解,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文.(一般很少用java代码对元数据进行配置) 21  Spring基于注解的容器配置.和开启配置 相对于XML文件,

Java面试--Spring技术要点--Spring数据访问

24  Spring对DAO的支持 Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernateor JDO 结合使用.这使我们可以方便切换持久层.编码时也不用担心会捕获每种技术特有的异常. 优化了的异常类型体系:细化了数据访问异常,丰富了异常类型.(都是 Unchecked Exception,这种异常不会变动,采用同一种异常,表示同一种现象,与使用的持久化技术无关) 使用模板回调模式,开发者不再写模式化代码,简化编程: 不变:资源的获取,资源的释放,异常转

Spring技术内幕——Spring Framework的IOC容器实现(一)

一.SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架IOC容器来完成.他可以再解耦代码的同时提高了代码的可测试性. 依赖控制反转的实现由很多种方式,在Spring中,IOC容器是实现这个模式的载体,他可以再对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖注入是可以递归的,对象被逐

Spring技术内幕——Spring的设计理念和整体架构

横看成岭侧成峰,远近高低各不同. 不识庐山真面目,只缘身在此山中. --苏轼 Spring的各个子项目 1.Spring Framework(Core):Spring项目的核心.包含了一系列IOC容器的设计,提供了反转模式的实现,同时还集成了AOP功能.另外,在Spring Framework中,还包含了其他Spring的基本模块,比如MVC.JDBC.事务处理模块的实现. 2.Spring Web Flow:建立在Spring MVC基础上的Web工作流引擎.定义了一种特定的语言来描述工作流,

Spring技术内幕——Spring Framework的IOC容器实现(二)

三.IOC容器的初始化过程 IOC容器的初始化时由前面介绍的refresh方法来启动的,这个方法标志着IOC容器的正式启动.这个启动包括BeanDefinition的Resource定位.载入和注册.下面我们将详细分析这三个实现过程,Spring把这三个过程分开,并使用不同的模块来完成,通过这样的设计让用户更加灵活的这三个过程进行剪裁和扩展,定义出最适合自己的IOC容器的初始化过程. 第一个过程: Resource定位过程,是指BeanDefinition的资源定位,他由ResourceLoad

Spring技术内幕——Spring Framework的IOC容器实现(三)

接上一篇的时序图.这里调用的loadBeanDefintions实际上是一个抽象方法,那么实际载入过程发生在哪里呢?在loadBeanDefintions中,初始化了读取器XMLBeanDefinitionReader,然后把这个读取器在IOC容器中设置好(过程和编程式使用XMLBeanFactory是类似的),最后是启动读取器来完成BeanDefinition在IOC容器中的载入,代码如下: /** * Convenient base class for {@link org.springfr

Spring技术内幕——Spring Framework的IOC容器实现(五)(大结局)

这里通过使用BeanDefinitionResolver来对BeanDefinition进行解析,然后注入到property中.下面到BeanDefinitionValueResolver中看一下解析过程,以对Bean reference进行解析为例 /** * Resolve a reference to another bean in the factory. * class BeanDefinitionValueResolver */ private Object resolveRefer