将业务对象的创建主动权从我们自己交到了spring ioc 容器的手上。用的时候直接 Autowired 注入进去(感觉有点像Java 内存分配回收的出发点,将创建对象和回收 不要对象 垃圾交给ivm去 处理)
带给我们什么:帮助我们解耦对象间依赖关系的的对象绑定方式。
ioc容器 BeanFactary
Spring 提供两种容器 :BeanFactary 和ApplicationContexBeanFactory
BeanFactary 使用的为lazy-load 懒加载的方式,启动速度初期较快。
ApplicationContext 继承BeanFactary,提供BeanFactary 的所有实现,要求加载时一起加载,初始化时比较慢,要求的资源会多。现在我们用的ioc 容器为ApplicationContext
ioc容器实现功能 ,分为两个部分,容器启动和Bean的实例化。
当一个Java类 交给Spring 容器去处理,并经过 Spring 对象的生命周期,才叫 bean 或者可以说是component。
自己也以为 当Java类 加上 注解或者 Spring 配置文件 xml <bean id ="" > 配置后 ,Spring 的ioc 容器会 直接实例化 这个对象,中间的过程其实是不清除的,在听公开课老师讲,spring的循环依赖时学习到了一个bean 从加载到 ioc容器到实例化这个对象的过程。
当Java类 确定为要交给 spring 容器去管理时
--------首先会产生一个BeanDefintion 对象,它记录了该bean 的各种配置(当年在配置bean 的时候 的属性,如 是否进行懒加载,bean 的作用域是什么 singleton、prototype、session、request)及 它对应的类 (com.xxx.xxx.controller.xxController)
---------然后会有一个BeanDefintionMap 集 去存放 所以加载bean 的类名 为key ,value 为该BeanDefintion对象,并将bean的类名称加到到一个list 中 。
--------然后会遍历这个list 中的各自名称,根据名称作为key ,得到该 BeanDefintion ,然后判断 如果为bean的作用域为单例啊 是否是非懒加载啊 ,则 new 实例化(此时 才会真正的实例类 ) 并加入 单例池中,如果为原型模式则不实例化。
此时老师也指出了 在这个过程中 如果程序员 将 map 中的 BeanDefintion 与它对应的类换成 其他的类的话,则虽然是 加载的这个bean 但实际上实例化的为另一个。 说是 对spring 的扩展,有种奇技淫巧的感觉,,
先发出去,督促自己整理下去
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。