IOC容器簡介
咱們常常說Spring是一個IOC容器,Spring中這麼多代碼,那麼到底哪些類是IOC容器的主要表現形式呢?其實在Spring中IOC容器的主要表現形式是BeanFactory和ApplicationContext這兩個接口。這兩個接口的具體實現類就能夠當作是IOC容器在Spring中的具體體現。java
BeanFactory提供了最基本的IOC和依賴注入功能,ApplicationContext繼承了BeanFactory,在BeanFactory的基礎上添加了不少新功能,主要包括國際化、事件分發機制(ApplicationEvent)、資源訪問(Resource)等功能。在實際的開發過程當中,通常都會選擇ApplicationContext系列的容器實現。下面列舉下BeanFactory和ApplicationContext系列容器的常見實現類。spa
上圖是BeanFactory系列容器的繼承圖,須要重點關注的是DefaultListableBeanFactory,這個類是Spring默認使用基礎容器類。在每一個ApplicationContext容器中都使用這個基礎容器。code
上圖是ApplicationContext系列的容器實現。經常使用的有ClasspathXmlApplicationContext和XmlWebApplicationContext。Spring Boot還推出WebServerApplicationContext系列容器,從名字能夠看出這個系列的容器是支持內嵌Web Server功能的。可是因爲本博客介紹的是基礎Spring FrameWork功能,就沒列舉WebServer系列容器。感興趣的能夠本身去看下Spring Boot的相關內容。xml
使用IOC容器
初始化容器的代碼繼承
//ClassPathXmlApplicationContext支持屢次refresh容器 ApplicationContext context = new ClassPathXmlApplicationContext("services.xml","daos.xml"); ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/config/services.xml"); ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/${placeHolder}/services.xml"); //使用groovy形式 ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy"); //先new再refresh() //不支持重複refresh GenericApplicationContext context = new GenericApplicationContext(); new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml"); context.refresh();
ClassPathXmlApplicationContext支持classpath:/${placeHolder}/services.xml這種以classpath打頭的入參接口
有時Spring的配置會比較多,若是將全部的配置都放在一個文件中會顯得比較亂。這時咱們能夠將同類別的配置放在一個配置文件中。而後再用impoer導入到一個文件中便可.事件
<beans> <import resource="services.xml"/> <import resource="resources/messageSource.xml"/> <import resource="/resources/themeSource.xml"/> <bean id="bean1" class="..."/> <bean id="bean2" class="..."/> </beans>
配置形式
Spring支持多種形式的配置:傳統的xml形式,註解形式和Java code形式。資源