Spring是最常見的架構,那麼他的內在機制是什麼呢。
public class TestBean {private String str = "haha";public String getStr() {return str;}}
public class TestSpring {public static void main(String[] args) {DefaultListableBeanFactory f = new XmlBeanFactory(new ClassPathResource("test.xml"));System.out.println(f.getBeanDefinitionCount());TestBean bean = (TestBean) f.getBean("testStr");System.out.println(bean.getStr());}}
<?xml version="1.0" encoding="utf-8" ?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><bean id = "testStr" class="cn.pn.spring.TestBean"></bean></beans>
為什麼通過這樣一種方式就直接擷取到了Bean執行個體呢。
猜想一下,我們要定義了Bean,然後定義設定檔,就可以擷取了。它的內在機制應該是拿到設定檔資訊,根據反射擷取Bean的執行個體。
那麼就有兩個重點。
擷取Bean的配置資訊,可以是xml可以是註解。
根據配置資訊去裝配Bean,消極式載入或者直接執行個體化。
畫了一下XmlBeanFactory的結構圖:
最頂級的BeanFactory介面定義了Bean的準系統:擷取bean的模板方式和判斷bean的屬性。
實現它的有三個擴充介面:
AutowireCapableBeanFactory:顧名思義這個擴充介面主要定義的功能是:自動裝配的方式,bean的依賴關係,包含了Bean的初始化和銷毀,我的理解是定義了bean的生命週期功能。
HierarchicalBeanFactory:這個介面定義了兩個方法,擷取父類Bean工廠和判斷是否包含本級的bean,如果看過Servlet源碼能理解這個地方,讓子類能專註做自己的事情。
ListableBeanFactory:一句話解釋就是,提供了擷取所有bean的配置清單,而不是顯示調用getBean的時候去執行個體化Bean,換句話說就是擷取非消極式載入的bean工廠都需要實現這個介面。包含了擷取bean的幾種方式,bean的數量和name。
下面描述一下其他的類:
AliasRegistry:定義了對alias的簡單增刪改等操作。
SingletonBeanRegistry:定義了對單例的bean的註冊和擷取。
ConfigurableBeanFactory:提供了配置factory的各種方法,scope,bean的依賴等各種方法。