实验八:bean之间的依赖(仅改变bean的创建顺序)
一般bean的创建顺序是按照配置顺序进行创建的,要想改变bean的创建顺序可以使用:使用depends-on=“依赖的bean”:即代表依赖的bean要先创建
如
即表示car创建在person之前
实验九:测试bean的作用域分别创建单实例和多实例的bean(重要)
bean的作用域:指定bean是否是单实例:默认是单实例的
用scope=来设置默认为singleton
prototype:多实例的
1)容器启动默认不去创建实例bean
2)获取实例时才会进行创建bean
3)每次获取都会创建一个新的实例
singleton:单实例的,默认的
1)在容器启动完成之前就已经创建好对象保存到容器中了
2)任何时候获取都是获取之前创建好的对象
request:在web环境下,同一次请求创建一个bean实例(基本不用)
session:在web环境下,同一次会话创建一个bean实例(基本不用)
将book设置为多实例
实验十:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、FactoryBean(重要)
bean的创建默认就是框架通过反射new出来的bean实例
工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类这个类就是工厂
如:AirPlane ap=AirPlaneFactory.getAirPlane(String jzName);
两种工厂:
静态工厂:工厂本身不用创建对象:都是通过静态方法调用,对象=工厂类.方法名()
实例工厂:工厂本身需要创建对象:工厂类 对象=new 工厂类();
工厂对象.方法名()
1.静态工厂(不需要创建工厂对象) factory-method="getAirPlane"指定哪个方法为工厂方法
class:指定静态工厂的全类名
factory-method:指定哪个方法为工厂方法
constructor-arg:为方法指定参数
如:
先创建静态工厂类
IOC容器中配置使用
2.实例工厂
先创建实例工厂对象
在创建需要通过工厂创建的对象bean
factory-bean:指定当前对象创建使用哪个工厂
factory-method:指定当前对象创建使用工厂的工厂方法
constructor-arg:为方法指定参数
如先创建实例工厂类
IOC容器中先创建工厂bean
使用工厂创建其他bean
3.FactoryBean(是Spring规定的一个接口)
只要是这个接口的实现类Spring都认为是一个工厂
1.ioc容器启动的时候不会创建这个实例
2.FactoryBean:获取的时候才创建对象
如:先创建实现FactoryBean接口的工厂类
之后在IOC容器中对这个工厂类进行注册
注册完成后直接获取该工厂bean即会创建相应的bean
实验十一创建带有生命周期方法的bean
生命周期:bean的创建到销毁
ioc容器中注册的bean
1)单例bean,容器启动时创建好,容器关闭时销毁
2)多实例bean,获取的时候创建
我们可以为bean自定义一些生命周期方法:spring在创建或者销毁的时候就会调用指定的方法
destroy-method="方法名" 销毁时运行其中的方法
init-method="方法名" 初始化时运行其中的方法
注意初始化方法和销毁方法可以自定义:但是方法可以抛异常但是不能有参数
如destroy-method="myDestory" init-method="myInit"
myDestory和myInit均为自定义方法
单例Bean的生命周期
(容器启动)构造器—>初始化方法—>(容器关闭)销毁方法
在Book类中的myDestory和myInit方法
多例Bean的生命周期
获取bean(构造器—>初始化方法)—>容器关闭不会调用bean的销毁方法
实验十二:测试bean的后置处理器:BeanPostProcessor
Spring有一个接口,后置处理器,可以在bean的初始化前后调用这个方法
注意:无论bean是否有初始化方法后置处理器都会默认其有初始化方法
仍然会继续工作
加入后置处理器之后的bean的生命周期
(容器启动)构造器--->后置处理器的before方法--->初始化方法--->后置处理器的after方法--->初始化完成--->(容器关闭)销毁方法
如:
先编写后置处理器的实现类
之后注册后置处理器的实现类,注册之后即会生效,当容器创建bean时即会运行后置处理器中的方法