1.什麼是spring IOC IOC(Inversion of Control)即控制反轉,在我們以往的編程中如果需要一個bean往往需要去手動去new一個出來。而spring幫我們解決了這個問題,在spring中我們只需要去定義bean,spring就會自動的幫我們實例化並管理Bean。而這些B ...
1.什麼是spring IOC
IOC(Inversion of Control)即控制反轉,在我們以往的編程中如果需要一個bean往往需要去手動去new一個出來。而spring幫我們解決了這個問題,在spring中我們只需要去定義bean,spring就會自動的幫我們實例化並管理Bean。而這些Bean就管理在spring容器中。
2.什麼是spring 容器
相信在此之前各位小伙伴也看過一些spring容器先關的介紹,感覺很高端有沒有....竟然可以自動的管理Bean。其實spring容器只是有若幹的Map組成的。
3.與spring容器相關的組件:
(1). BeanDefinition(Bean的定義)
舉個例子:
①首先我們定義一個User類,併在xml文件中配置:
②啟動Bean容器我們看看BeanDefinition中有什麼
我們發現在xml文件中配置的屬性與BeanDefinition相同,因此在spring中BeanDefinition用來表示我們配置的一個個<bean/>
(2)BeanDefinitionRegistry(用來註冊BeanDefinition的容器),這是一個介面,其實現類為DefaultListableBeanFactory。
我們來看看DefaultListableBeanFactory的源碼:
①其內含有一個ConcurrentHashMap用來存儲Bean的定義
/** Map of bean definition objects, keyed by bean name */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);
②registerBeanDefinition方法用來講我們的BeanDefinition註冊到DefaultListableBeanFactory中
@Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException {
(3)DefaultSingletonBeanRegistry:用來管理我們的單例Bean
/** Cache of singleton objects: bean name --> bean instance */ private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256); /** Cache of early singleton objects: bean name --> bean instance */ private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
不難看出在這兩個map中一個用來管理普通的單例Bean,一個用來存儲延遲載入的單例Bean.
4.總結
所以我們一般所指的spring容器包括三個Map,其中DefaultListableBeanFactory中的map用來管理我們的BeanDefinition,而DefaultSingletonBeanRegistry中的map用來管理我們的單例Bean。
這裡只是介紹下對於spring IOC以及spring容器的理解,具體的流程參考bean的生命周期。