7 Spring IOC(依赖注入)的方式
- Setter方法注入
- 构造器方法注入
- 工厂方法注入(实例工厂/静态工厂)
- 自动装配(需要开启配置,不建议使用)
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容器提供配置元数据。
- XML配置文件。
- 基于注解的配置。
- 基于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的生命周期
- Bean的建立:Spring容器从XML 文件中读取bean的定义,并实例化bean。
- 属性注入:Spring根据bean的定义填充所有的属性。
- 如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。
- 如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。
- 如果Bean实现了ApplicationContextAware接口,Spring传递applicationContext给setApplicationContext方法。
- 如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
- 如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
- 执行Bean的init-method:可以在Bean定义文件中使用"init-method"属性设定方法名称例如:<beancalss="onlyfun.caterpillar.HelloBean"init-method="initBean">。
- 如果有BeanPostProcessors和bean 关联,这些bean的postProcessAfterInitialization()方法将被调用。
- 如果bean实现了DisposableBean,它将调用destroy()方法。
- 执行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字符串和类。
- 模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。