一、Spring Bean
Spring Bean的配置形式:
• 基于xml的配置文件
• 基于注解的配置
• 基于java的配置
spring bean的定义:
被称作 bean 的对象是构成应用程序的支柱也是由 Spring IoC 容器管理的。bean 是一个被实例化,组装,并通过Spring IoC 容器所管理的对象。
1) spring bean 生命周期
理解 Spring bean 的生命周期很容易。当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。
为了定义安装和拆卸一个 bean,我们只要声明带有 init-method 和/或 destroy-method 参数的。init-method 属性指定一个方法,在实例化 bean 时,立即调用该方法。同样,destroy-method指定一个方法,只有从容器中移除 bean 之后,才能调用该方法。
bean的初始化方法:在实例化bean前,调用初始化方法
首先创建一个InitBean类
配置beans.xml文件
编写测试方法
结果:
同理在bean的销毁时,同样配置destroy-method="dostroy".而该方法是在容器关闭时调用的,在这方法就不截图演示了.
2)spring bean的作用域
默认为:singletion
实列如下:
singleton为默认的
1. 首先创建一个ScopeBean类
2.配置beans.xml文件
3.编写测试scope,并且从容器中去两次,看结果如何
4.结果:
如果在配置文件中添加scope="prototype",则会实列化两次,并且哈希值也不一样,说明不是一个对象,这个属性就说明了prototype可以创建任意数量的对象实列;
截图如下:
配置文件
测试结果:
比较常用的singleton和prototype。如果一个Bean实例被设置为singleton,那么每次请求该Bean时都会获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为。如果一个Bean实例被设置为prototype,那么每次请求该di的Bean,Spring都会创建一个新的Bean实例返回给程序,在这种情况下,Spring容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器将不会再跟踪实例,也不会维护Bean实例的状态。
如果我们不指定Bean的作用域,则Spring会默认使用singleton作用域。
Java在创建Java实例时,需要进行内存申请。销毁实例时,需要完成垃圾回收。这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价会比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean的作用域设置为prototype。
3)spring bean的继承
事列如下:
首先编写一个HellWorld类和HelloChina类并生成他们的getset方法
编写配置文件:
测试类:
结果:
这是正常的结果,如果在配置文件中添加parent属性,则子类继承父类
结果:
如果在这不注释原有的属性的,则还是保持原有的属性;
注意这还可以把父bean中添加abstract="true",默认是FALSE,这样的话,该父bean就不能事列话,运行就会出错,如下
错误org.springframework.beans.factory.BeanIsAbstractException: Errorcreating bean with name 'hello': Bean definition is abstract
总结几点bean的继承:
•
Spring同意继承bean的配置,被继承的bean称为父bean。继承这个父Bean的Bean称为子Bean
→
子Bean从父Bean中继承配置,包含Bean的属性配置
→ 子Bean也能够
覆盖从父Bean继承过来的配置
• 父Bean能够作为配置模版,也能够作为Bean实例,
若仅仅想把父Bean作为模版,能够配置的abstract属性为true。这样Spring将不会实例化这个Bean
→
并非元素里的全部属性都会被继承。比方:autowire,abstract等。
→ 也
能够忽略父Bean的class属性,让子Bean指定自己的类,而共享同样的属性配置,但此时
abstract必须设为true