本文主要介紹了Spring的相關(guān)知識(shí).
一.Spring的概念.
Spring是一個(gè)開源框架,是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建.
Spring的根本使命:簡(jiǎn)化Java開發(fā).
具體簡(jiǎn)化策略:
- 基于POJO的輕量級(jí)和最小侵入性編程.
- 通過(guò)依賴注入和面向接口實(shí)現(xiàn)松耦合.
- 基于切面和慣例進(jìn)行聲明式編程.
- 通過(guò)切面和模板減少樣板式代碼.
1.POJO
POJO(Plain Ordinary Java Object)是一個(gè)簡(jiǎn)單的普通的Java對(duì)象,它不包含業(yè)務(wù)邏輯或持久邏輯,不是JavaBean, EntityBean等.POJO不擔(dān)當(dāng)任何特殊的角色,也不實(shí)現(xiàn)任何特殊的Java框架的接口.
2.依賴注入
- 對(duì)象的依賴關(guān)系將有負(fù)責(zé)協(xié)調(diào)系統(tǒng)中各個(gè)對(duì)象的第三方組件在創(chuàng)建對(duì)象時(shí)設(shè)定,對(duì)象無(wú)需自行創(chuàng)建或管理他們的依賴關(guān)系,依賴關(guān)系將被自動(dòng)注入到需要它們的對(duì)象中去.
- 組件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關(guān)系.容器全權(quán)負(fù)責(zé)組件的裝配绸吸,它會(huì)把符合依賴關(guān)系的對(duì)象通過(guò)JavaBean屬性或者構(gòu)造函數(shù)傳遞給需要的對(duì)象.
3.AOP
通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù).
二.Spring的核心.
容器是Spring框架的核心.
Spring容器分為以下兩種類型
- bean工廠
- 應(yīng)用上下文.(下面主要講解通過(guò)應(yīng)用上下文管理bean)
1.應(yīng)用上下文
Spring中自帶的多種應(yīng)用上下文,分別為:
- AnnotationConfigApplicationContext:
從一個(gè)或多個(gè)基于Java的配置類中加載Spring應(yīng)用上下文
例子:ApplicationContext context = new AnnotationConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);
- AnnotationConfigWebApplicationContext:
從一個(gè)或多個(gè)基于Java的配置類中加載Spring Web應(yīng)用上下文 - ClassPathXmlApplicationContext:
從類路徑下的一個(gè)或多個(gè)XML配置文件中加載上下文定義,把應(yīng)用上下文的定義文件作為類資源.
例子:ApplicationContext context = new ClassPathXmlApplicationContext(knight.xml);
- FileSystemXmlApplicationContext:
從文件系統(tǒng)下的一個(gè)或多個(gè)XML配置文件中加載上下文定義
例子:ApplicationContext context = new FileSystemXmlApplicationContext(c:/knight.xml);
- XmlWebApplicationContext:
從Web應(yīng)用下的一個(gè)或多個(gè)XML配置文件中加載上下文定義
2.bean生命周期.
- Spring對(duì)bean進(jìn)行實(shí)例化.
- Spring將值和bean的引用注入到bean對(duì)應(yīng)的屬性中.
- 如果 bean 實(shí)現(xiàn)BeanNameAware接口,Spring將bean的ID傳遞給setBeanName()方法.
- 如果bean實(shí)現(xiàn)了BeanFactoryAware接口,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實(shí)例傳入.
- 如果bean實(shí)現(xiàn)了ApplicationContextAware接口,Spring將調(diào)用setApplicationContext()方法,將bean所在的應(yīng)用上下文的引用傳入進(jìn)來(lái).
- 如果bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring將調(diào)用它們的postProcessBeforeInitialization()方法.
- 如果bean實(shí)現(xiàn)了InitializingBean接口,Spring將調(diào)用它們的afterPropertiesSet()接口方法.類似的,如果bean使用init-method聲明了初始化方法,該方法也會(huì)被調(diào)用.
- 如果bean實(shí)現(xiàn)了BeanPostProcessor接口,Spring將調(diào)用它們的postProcessAfterInitialization()方法.
- 此時(shí),bean將駐留在應(yīng)用上下文中,直到應(yīng)用上下文被銷毀.
- 如果bean實(shí)現(xiàn)了了DisposableBean接口,Spring將調(diào)用它的Destroy()接口方法.如果bean使用destroy-method聲明了銷毀方法,該方法也會(huì)被調(diào)用.
三.Spring的模塊劃分.
Data access &integration | Web and romoting | AOP | Instrumentation | Core Spring container | Test |
---|---|---|---|---|---|
JDBC | Web | AOP | Instrument | Beans | Test |
ORM | Servlet | Aspects | Instrument Tomcat | Core | |
Transaction | Portlet | Context | |||
OXM | Struts | Expression | |||
JMS | Contextsupport |
四.總結(jié).
Spring是一個(gè)框架
,這個(gè)框架的核心是容器
,現(xiàn)在大部分使用的容器類型是應(yīng)用上下文
,Spring主要通過(guò)應(yīng)用上下文去管理bean.