Spring17_配置文件详解3
一、Bean标签基本配置
用于配置对象交由Spring来创建。
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
二、Bean标签范围配置
scope:指对象的作用范围,取值如下:
1. 当scope的取值为singleton时
Bean的实例化个数:1个
Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例
Bean的生命周期:
a. 对象创建:当应用加载,创建容器时,对象就被创建了
b. 对象运行:只要容器在,对象一直活着
c. 对象销毁:当应用卸载,销毁容器时,对象就被销毁了
代码实现1:
执行test1,观察控制台输出,说明Spring容器中只有一个userDao bean。
代码实现2:当scope的取值为singleton时,bean对象何时被实例化?
applicationContext.xml配置文件设置scope="singleton",编辑UserDaoImpl新加无参构造函数
SpringTest加断点,debug执行,F8逐步执行,可以看到第一条语句执行完就调用了无参构造函数,表示当加载核心配置文件创建Spring容器时,bean就创建了
2. 当scope的取值为prototype时
Bean的实例化个数:多个
Bean的实例化时机:当调用getBean()方法时实例化Bean
Bean的生命周期:
a. 对象创建:当使用对象时,创建新的对象实例
b. 对象运行:只要对象在使用中,就一直活着
c. 对象销毁:当对象长时间不用时,被Java的垃圾回收器回收了
代码实现1:
执行test1,观察控制台输出,表示Spring容器中userDao不是同一个,是多个对象。
代码实现2:当scope的取值为prototype时,bean对象何时被实例化?
applicationContext.xml配置文件设置scope="prototype",编辑UserDaoImpl新加无参构造函数
SpringTest加断点,debug执行,F8逐步执行,可以看到第一条语句执行完控制台无任何信息,表示没有创建bean对象
F8继续执行,可以发现控制台输出了,表示当调用getBean()方法时创建了Bean对象,继续F8执行,又创建了一个bean对象
三、Bean生命周期配置
1. init-method:指定类中的初始化方法名称
2. destroy-method:指定类中销毁方法名称
代码实现:
执行test1,检查输出,可以看到先创建对象,对象再调用方法。
如果不加app.close()方法看不到destroy方法中的输出,因为执行的是单元测试,并不在tomcat容器中,单元测试执行完就应该销毁,没有打印销毁方法,是没来不及打印。所以加了app.close()手动关闭容器。
四、Bean实例化三种方式
无参构造方法实例化(重点);工厂静态方法实例化;工厂实例方法实例化
1. 使用无参构造方法实例化
它会根据默认无参构造方法来创建类对象,如果bean中没有默认无参构造函数,将会创建失败。
2. 工厂静态方法实例化
工厂的静态方法返回Bean实例
执行test1,检查控制台输出:
3. 工厂实例方法实例化
工厂的非晶态方法返回Bean实例
执行test1方法,检查控制台输出: