前言java
最近因爲一些工做的須要,還有本身知識的匱乏再次翻開spring。正好整理了一下相關的知識,彌補了以前對spring的一些錯誤認知。這一次學習,更加深刻的理解了Ioc和AOP的思想,並對其架構模塊有了更深一步的理解。web
剛開始翻看spring技術內幕,雖然有了一點看源碼的經驗,可是直接看如此深的源碼,仍是很頭疼。spring因爲業務的擴展,以及用戶羣的增長,對於某些模塊的類封裝的很深!所以追溯源碼是個很頭疼的問題,而直接看這本書,也是壓力山大。正則表達式
因而回去複習一下spring的基本知識,先學會走,在學跑。spring
先說說spring的核心模塊相關的概念,IOC和AOP。編程
IoC(inversion of control)控制反轉,也就是說,控制權由對象轉移,對象本身變成了被動的接受。架構
DI(dependency injection)依賴注入app
AOP(aspect oriented programming)面向切面編程框架
AOP中利用面向切面的編程理論,把每一個方法或者函數當作一個切面,在這個切面先後均可以執行不一樣的方法。ide
1 <bean id="service"> 2 <property name="interceptorNames" value="advisor"></property> 3 <property name="target">目標</property> 4 </bean>
這裏定義了一個攔截器,一個目標bean。函數
1 <bean id="advisor" class="..."> 2 <property name="advice">//攔截器對象 3 </property> 4 <property name="mappedName">//攔截的方法 5 </property> 6 </bean>
這個目標bean在執行時,會根據配置來肯定切面,精確到某個方法。而攔截的方法由上面的mappedName肯定,能夠經過名字或者經過正則表達式來肯定。攔截器對象肯定了攔截時觸發的函數。
能夠進行方法前攔截、方法後攔截、異常攔截。
能夠看到Spring Core是spring框架中最低層核心的模塊。提供了最基本的Ioc思想框架。
因爲spring是把一個類配置在xml配置文件中,從而進行一些相關的依賴或者注入等等。那麼這個配置文件,確定要被本地化存儲而且進行讀取。
所以在咱們使用前,要進行三步:
讀取spring配置文件
bean定義
注入到Ioc容器
以後咱們就能夠經過bean工廠的getBean獲取指定的bean了。
1 最常見的讀取配置文件的三種方法:
1 利用ClassPathResource讀取資源文件,傳入XmlBeanFactory中
1 ClassPathResource res = new ClassPathResource("application.xml") 2 XmlBeanFactory factory - new XmlBeanFactory(res); 3 factory.getBean("testBean");
2 利用輸入流,傳入到XmlBeanFactory中
1 InputStream is = new FileInputStream("C:\\ApplicationContext.xml"); 2 XmlBeanFactory factory - new XmlBeanFactory(is);
3 直接經過ClassPathXmlApplicationContext讀取資源文件
ClassPathXmlAppliationContext appContext = new ClassPathXmlApplicationContext("aaplicationContext.xml");
4 經過在web.xml中指定配置文件的目錄,自動讀取。關於配置文件的路徑有不少種寫法,經過指定ClassPath也能夠。
1 <listener> 2 <listener-class> 3 org.springframework.web.context.ContextLoaderListener 4 </listener-class> 5 </listener> 6 7 <context-param> 8 <param-name> contextConfigLocation</param-name> 9 <param-value> 10 /WEB-INF/classes/bean.xml 11 </param-value> 12 </context-param>
2 Bean的定義這部分就沒什麼好說的了,就是讀取配置文件,解析裏面的文件定義,抽取成數據模型。
3 而注入到Ioc容器中,就是把這個數據模型讀取到一個總的BeanFactory中,統一的進行管理。
咱們就能夠經過這個BeanFactory進行一些操做,好比GetBean()或者containsBean()等等。
下面簡單的羅列了一些配置的內容:
<bean id="examples.MyFactoryBean" factory-method="createInstance"/>
2 構造函數
<bean id="testBean" class="examples.ExampleBean"> <constructor-arg><ref bean="testArgs1"/></construtor-arg> <constructor-arg><ref bean="testArgs2"/></construtor-arg> </bean> 至關於 class testBean{ public testBean(testArgs1,testArgs2); }
3 單例模式
<bean id="testBean" class="test.testBean" singleton="false"> 每次請求生成的都是同一個bean
4 <idef> 與 <ref>做用相同,可是idef會在xml加載時 檢查 bean是否存在
destroy-method 銷燬,一般都是配置數據源、JDBC、輸入輸入流時,須要在close時銷燬對象 depends-on 前後順序實例化 init-method 初始化調用方法
BeanNameAware 讓類知道本身bean在xml中的id名字 BeanFactoryAware 得到beanFactory InitializingBean接口執行初始化方法 Disposablebean 執行銷燬方法
9 屬性覆蓋,這個一般是在配置了一些屬性,可是有其餘的一些文件修改了這個屬性時,使用。
好比說,咱們在項目中經過spring的配置文件配置了數據源的相關信息,可是額外有一個xxx.properties進行信息的重寫。當有這個文件時,可讓客戶本身修改其鏈接信息,而不用每次都去修改繁瑣的spring配置文件。
org.springframework.beans.factory.config.PropertyPlaceholderConfigurer