spring Bean
Bean是由springIoC容器实例化、管理、和装配的对象。
Bean在spring中相当于普通java中对象。
在XML配置文件,Bean的写法如下代码所示:
bean元素下的id属性是该Bean的唯一标识符,用于获取Bean实例时的索引,class属性用于指定Bean的实现类,格式为该类的完全限定名(即包名.类名),property元素下的name属性与Bean对应实现类中的属性相对应,value属性则为该属性赋值。若name属性的值为对象的引用,则将value改成ref.scope则为该Bean的作用域。
Bean的实例化
在普通java程序中,如果要使用一个对象,我们需要对其先进行实例化。而在spring中Bean也是如此。
spring框架实例化Bean有三种方式:
1.构造方法实例化
创建一个构造方法实例化的类
测试类
结果
2.静态工厂实例化
与构造方法实例化不同的是,静态工厂实例化需要创建一个静态工厂类,XML配置文件中bean元素下的class属性并非Bean对应的实现类,而是静态工厂类,同时使用factory-method属性指定静态工厂的方法。
创建一个静态工厂实例化的类
创建一个静态工厂类,此类中定义一个creatBean方法,并返回StaticFactoryBean实例。
测试类
结果
3.实例工厂实例化Bean
此方法也需要创建一个工厂类(不是静态),并且在该工厂类中创建一个实例方法来创建实例,在XML配置文件中需要使用factory-bean属性指定配置的实例工厂,factory-method属性指定配置的实例方法。同时还需要配置工厂bean和实现类的bean。
创建一个实例工厂实例化Bean对应的实现类
测试类
结果
以上就是实例化Bean的三种方式,一般构造方法实例化Bean用的比较多。
Bean的作用域
singleton:默认的作用域,使用singleton定义的Bean在spring容器中只有一个Bean实例。
prototype:spring容器每次获取Bean实例时,都会创建一个新的Bean实例。
request:在HTTP请求中容器会返回一个Bean实例,不同的HTTP请求返回的Bean实例不同,仅在web容器中有效。
session:在HTTPsession中,容器将返回一个Bean实例,仅在web容器中有效。
application:为每个ServletContext对象创建Bean实例,仅在web容器中有效。
websocket:为每个WebSocket对象创建一个Bean实例,仅在web容器中有效。
这里说下singleton作用域与prototype的区别。
singleton是默认的作用域,可配置也可以不配置,而prototype则需要在XML配置文件中配置,它们的属性为scope。
我的理解为多个Bean去引用一个Bean是,如果作用域为singleton时,那么这些Bean都共享这个引用的Bean,不需要这么Bean引用一次实例化一次,那个Bean引用一次也实例化一次,也就是单例。而作用域为prototype时,每个Bean去引用同一个Bean时都需要实例化一次,都会创建一个新的Bean。以下为代码实现。
创建一个Boss类
创建一个Car类
配置文件
测试类
当作用域为prototype时,boss boss1 boss2都引用car时,返回了不同的实例,这是因为每引用一次都会重新实例化一次。
当作用域为singleton时,boss boss1 boss2都引用car时,返回了相同同的实例,它们都共享同一个car
Bean的生命周期
spring 容器可以管理singleton作用域下Bean的生命周期,在此作用域下,spring容器能够精确知道Bean何时创建,何时销毁,而在prototype作用域下,spring容器只负责创建,创建完成后就不再追踪其生命周期也不会管理。
通过代码来演示Bean的生命周期
这里init-method属性指定初始化方法,destroy-method属性指定销毁方法。
结果