美文网首页
Spring IOC容器

Spring IOC容器

作者: 陈先森不喝酒 | 来源:发表于2019-09-30 17:25 被阅读0次

废话不多说,直接进入主题,从一个小问题开始,spring ioc 是用来干嘛的?

SpringIOC容器作用

Spring IOC 主要用于 Bean的 创建,存储,获取,依赖注入,就是这么粗暴直接了当,咱不来虚的。但是问题又来了,Spring IOC不可能凭空创建出来Bean,Bean是从哪儿来的?

Bean的定义

看了标题应该就知道了,Spring Ioc是通过Bean的定义来创建Bean的,Bean是怎么定义的呢?不卖关子了,那我就直说了,嘿嘿。Bean的属性定义呢有 id,name,scope,className,parent,Lazyinit,depends,property,这些属性表示什么呢,我捡几个我知道的说说:
scope:单例(singleton),多例(prototype),默认是单例
className:类的全名
property:Bean类的一些属性
depends:依赖哪儿些类的数组
lazy-init:true懒加载,false非懒加载
问题总是没完没了,定义好了,放在哪儿呢?Bean定义存储在xml或properties文件中,当然现在用的都是注解,换汤不换药。现在是怎么获取Bean的定义?

加载解析Bean

首先加载xml文件流(XmlBeanDefinitionReader.loadBeanDefinitions)转换成Document,要把这个Document解析(BeanDefinitionDocumentReader)成BeanDefinition。这个BeanDefinition的属性就是xml文件中定义的Bean属性。解析好了BeanDefinition要放在哪儿?
这个呢要注册(BeanDefinitionRegistry)进注册器中。

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions("spring.xml");
Test test = factory.getBean(Test.class);

现在只是有了配方,根据这个配方怎么创建具体的类?

创建获取Bean

AbstractBeanFactory 先(getSingleton)从缓存(DefaultSingletonBeanRegistry中singletonObjects属性 类型ConcurrentHashMap 初始化256个)中获取bean,获取不到再创建(AbstractAutowireCapableBeanFactory),是通过反射创建的。

bean的生命周期

创建、初始化、销毁。init-method、destroy-method

FactoryBean 与 BeanFactory 区别

FactoryBean 创建自定义Bean,BeanFactory 创建(getObjectForBeanInstance)包含FactoryBean的bean

相关文章

网友评论

      本文标题:Spring IOC容器

      本文链接:https://www.haomeiwen.com/subject/uubductx.html