一、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类


spring properties 字符串替换 spring运行期间替换bean_spring-bean的继承


配置beans.xml文件


spring properties 字符串替换 spring运行期间替换bean_spring-bean的生命周期_02


编写测试方法


spring properties 字符串替换 spring运行期间替换bean_作用域_03


结果:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的生命周期_04


同理在bean的销毁时,同样配置destroy-method="dostroy".而该方法是在容器关闭时调用的,在这方法就不截图演示了.


2)spring bean的作用域


默认为:singletion


spring properties 字符串替换 spring运行期间替换bean_spring-bean的生命周期_05


实列如下:


singleton为默认的


1. 首先创建一个ScopeBean类


spring properties 字符串替换 spring运行期间替换bean_作用域_06


2.配置beans.xml文件


spring properties 字符串替换 spring运行期间替换bean_spring-bean的继承_07


3.编写测试scope,并且从容器中去两次,看结果如何


spring properties 字符串替换 spring运行期间替换bean_作用域_08


4.结果:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的作用域_09


如果在配置文件中添加scope="prototype",则会实列化两次,并且哈希值也不一样,说明不是一个对象,这个属性就说明了prototype可以创建任意数量的对象实列;


截图如下:


配置文件


spring properties 字符串替换 spring运行期间替换bean_spring-bean的生命周期_10


测试结果:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的继承_11


比较常用的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方法


spring properties 字符串替换 spring运行期间替换bean_spring-bean的继承_12


spring properties 字符串替换 spring运行期间替换bean_spring-bean的作用域_13


编写配置文件:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的作用域_14


测试类:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的作用域_15


结果:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的继承_16


这是正常的结果,如果在配置文件中添加parent属性,则子类继承父类


spring properties 字符串替换 spring运行期间替换bean_spring-bean的继承_17


结果:


spring properties 字符串替换 spring运行期间替换bean_spring-bean的生命周期_18


如果在这不注释原有的属性的,则还是保持原有的属性;


注意这还可以把父bean中添加abstract="true",默认是FALSE,这样的话,该父bean就不能事列话,运行就会出错,如下


spring properties 字符串替换 spring运行期间替换bean_spring-bean的生命周期_19


错误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