废话不多说,直接进入主题,从一个小问题开始,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
网友评论