Spring IOC例子实现步骤:
- 导入Spring Ioc的依赖包
- 创建Dao接口及接口实现类
- 创建Spring核心配置文件(application.xml文件),并配置<bean>标签
- 创建demo类,获取application.xml的上下文对象,并由该对象获取一个 bean 实例
- 由 bean 对象调用方法
配图:
配置文件中的<bean>标签解释:
id就是这个bean的“名字”,保证全局唯一即可,尽可能的见名知意
class是全限定包名,也就是要用到的接口实现类的全包名,这里之所以这么做是因为,根据全包名然后通过反射可以获得bean实例,但是要保证接口实现类里面有无参构造方法,因为反射也是通过无参构造方法实现的。
Bean标签范围配置
我们在配置Bean标签时,也可以配置其取值范围,或者叫做“存在范围”
如果没写 scope 范围,那便是默认的 singleton
下面用代码演示一下:
ps:在test包下测试,提前在pom.xml里面加入 Junit 依赖
首先看一下 scope是默认的情况
结果一猜就知道,地址值是一样的
接下来再看一下 scope 是prototype的情况
地址值不一样,那也证明了 prototype 是多例的,即每次都创建一个不同的对象实例
Bean的实例化个数、时机及生命周期
代码演示:
首先演示单例模式
在接口实现类中重写无参构造方法,以便展示效果
我们可以清楚的看到,debug模式下,当加载完配置文件时无参构造方法就已经被调用了,也即 已经实例化Bean对象了
直到debug走完,打印相同的地址值,如下图
总结:
当scope的取值范围为singleton时
- Bean的实例化个数:1个
- Bean的实例化时机:当Spring核心配置文件被加载时,实例化配置的Bean实例
- Bean的生命周期:
1.对象创建:当应用加载,创建容器时,对象就被创建了
2.对象运行:只要容器在,对象一直存活
3.对象销毁:当应用卸载,销毁容器时,对象就被销毁了
其次演示多例模式
当debug加载完配置文件时,
当debug执行完一个 getBean() 时,
当debug执行完第二个 getBean() 时,
当debug走完全部代码,
总结:
当 scope 的取值范围为prototype时
- Bean的实例化个数:多个
- Bean的实例化时机:当调用getBean()方法时实例化Bean
- Bean的生命周期:
1.对象创建:当使用对象时,创建新的对象实例
2.对象运行:只要对象在使用,就一直活着
3.对象销毁:当对象长时间不使用时,被Java的垃圾回收器回收了