SpringBean定义
被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。这些 bean 是由用容器提供的配置元数据创建的。
bean 定义包含称为配置元数据的信息,下述容器也需要知道配置元数据:
- 如何创建一个bean
- bean的生命周期的详细信息
- bean的依赖关系
上述所有的配置元数据转换成一组构成每个 bean 定义的下列属性
SpringBean的创建
Bean创建的两种规则:
- BeanFactory:提供的是一种延迟加载思想来创建bean对象。bean对象什么时候用什么时候创建。
- ApplicationContext:提供的是一种立即加载的思想来创建bean对象。只要一解析完配置文件,就立马创建bean对象。
Bean的三种创建方法:
- 第一种:调用默认无参构造函数创建(使用最多)
默认情况下,如果类中没有默认无参构造函数,则创建失败,会报异常。 - 第二种:使用静态工厂中的方法创建对象
需要使用bean标签的factory-method属性,指定静态工厂中创建对象的方法。 - 第三种:使用实例工厂方法创建
Bean标签
- 作用:用于配置对象让spring来创建的。
默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。 - 属性:
id:给对象在容器中提供一个唯一标识。用于获取对象。
class:指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
scope:指定对象的作用范围
Spring配置元数据
Spring IoC 容器完全由实际编写的配置元数据的格式解耦。有下面三个重要的方法把配置元数据提供给 Spring 容器:
- 基于XML的配置文件
- 基于注解的配置
- 基于Java的配置
Bean的作用域
当在 Spring 中定义一个 bean 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton。
Spring 框架支持以下五个作用域:
- singleton 作用域(单例):
singleton 是默认的作用域,也就是说,当定义 Bean 时,如果没有指定作用域配置项,则 Bean 的作用域被默认为 singleton。
当一个bean的作用域为Singleton,那么Spring
IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。
也就是说,当将一个bean定义设置为singleton作用域的时候,Spring IoC容器只会创建该bean定义的唯一实例。
Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。 - prototype 作用域(多例)
当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。**Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。**根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。 - request:作用范围是一次请求,和当前请求的转发。
- session:作用范围是一次会话。
- globalsession:作用范围是一次全局会话。
Bean的生命周期
- 涉及bean标签的两个属性:
init-method
destroy-method - 单例:
出生:容器创建,对象就产生了。
活着:只要容器在,对象就一直存在。
死亡:容器销毁,对象消亡。 - 多例:
出生:每次使用时,创建对象。
活着:只要对象在使用中,就一直活着。
死亡:当对象长时间不使用,并且也没有别的对象引用时,由java的垃圾回收器回收。