IOC控制反转:对象的创建控制权由程序转移到外部。
背景:企业中代码耦合度较高,若想修改代码,需要重新编译、打包、发布等一系列操作,较麻烦、解决方案:使用对象时在程序中不要主动使用new产生对象,转换为由外部提供对象。
spring提供了一个容器,成为Ioc容器,充当Ioc思想中的外部。
Ioc容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象 在容器中成为Bean。
依赖注入:在容器中建立bean与bean之间的依赖关系的整个过程。
需要编写set方法,set方法由容器调用。
第一个bookDao是类的成员变量名字第二个是引用,对另一个bean对象的引用,也在配置文件中定义。
Spring中默认bean为单例的,即先后两次创建对象,两次对象的地址是同样的。
一个对象用了一次后下次还是使用该对象,从容器中拿,这样效率才会高。
记录成员变量属性值的对象不适合交给容器管理。
bean实例化:
1.构造方法
Spring创建对象本质上还是通过构造函数,且调用的为无参构造函数。若只编写一个有参构造函数将会报错。且构造函数private、public都可以正常创建对象。(使用反射)
2.静态工厂
早些年使用的方式,制造对象不要自己new,使用工厂的方式。(了解即可)
3.实例工厂
了解
bean的生命周期
在配置中添加 init-method、destory-method即可在bean创建和销毁时添加一些业务逻辑。自己实现该方法即可。
但是Java程序运行在虚拟机中,程序运行完虚拟机就退出了,没有给销毁bean的机会。
解决方案:
1.在虚拟机退出之前将容器关闭,调用容器.close(); (很暴力,且代码位置固定)
2.设置关闭钩子。
类的构造函数最优先调用,然后到set方法,最后才是初始化方法(即init-method)。