Spring 框架中核心組件有三個:Core、Context 和 Beans。其中最核心的組件就是Beans, Spring提供的最核心的功能就是Bean Factory。html
Spring 解決了的最核心的問題就是把對象之間的依賴關係轉爲用配置文件來管理,也就是Spring的依賴注入機制。這個注入機制是在Ioc 容器中進行管理的。java
Bean 組件是在 Spring 的 org.springframework.beans 包下。這個包主要解決了以下功能:Bean 的定義、Bean 的建立以及對 Bean 的解析。對 Spring 的使用者來講惟一須要關心的就是 Bean 的建立,其餘兩個由 Spring 內部機制完成。 Spring Bean 的建立採用典型的工廠模式,他的頂級接口是 BeanFactory。spring
BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。可是從上圖中咱們能夠發現最終的默認實現類是 DefaultListableBeanFactory,他實現了全部的接口。那爲什麼要定義這麼多層次的接口呢?查閱這些接口的源碼和說明發現,每一個接口都有他使用的場合,它主要是爲了區分在 Spring 內部在操做過程當中對象的傳遞和轉化過程當中,對對象的數據訪問所作的限制。例如 ListableBeanFactory 接口表示這些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關係的,也就是每一個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規則。這四個接口共同定義了 Bean 的集合、Bean 之間的關係、以及 Bean 行爲。sql
Bean 的定義就是完整的描述了在 Spring 的配置文件中你定義的 <bean/> 節點中全部的信息,包括各類子節點。當 Spring 成功解析你定義的一個 <bean/> 節點後,在 Spring 的內部他就被轉化成 BeanDefinition 對象。之後全部的操做都是對這個對象完成的。Bean 的解析過程很是複雜,功能被分的很細,由於這裏須要被擴展的地方不少,必須保證有足夠的靈活性,以應對可能的變化。Bean 的解析主要就是對 Spring 配置文件的解析。數據庫
七大模塊,以下:apache
1. Spring Core: Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這裏的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的須要,並真正地容許你從程序邏輯中分離出依賴關係和配置。編程
2.Spring Context: 構建於Core封裝包基礎上的 Context封裝包,提供了一種框架式的對象訪問方法,有些象JNDI註冊器。Context封裝包的特性得自於Beans封裝包,並添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明建立,好比說經過Servlet容器。安全
3.Spring DAO: DAO (Data Access Object)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。 而且,JDBC封裝包還提供了一種比編程性更好的聲明性事務管理方法,不只僅是實現了特定接口,並且對全部的POJOs(plain old Java objects)都適用。服務器
4.Spring ORM: ORM 封裝包提供了經常使用的「對象/關係」映射APIs的集成層。 其中包括JPA、JDO、Hibernate 和 iBatis 。利用ORM封裝包,能夠混合使用全部Spring提供的特性進行「對象/關係」映射,如前邊提到的簡單聲明性事務管理。mvc
5.Spring AOP: Spring的 AOP 封裝包提供了符合AOP Alliance規範的面向方面的編程實現,讓你能夠定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。並且,利用source-level的元數據功能,還能夠將各類行爲信息合併到你的代碼中。
6.Spring Web: Spring中的 Web 包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servlet listeners進行IOC容器初始化和針對Web的ApplicationContext。當與WebWork或Struts一塊兒使用Spring時,這個包使Spring可與其餘框架結合。
7.Spring Web MVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架並非僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型代碼和Web Form之間。而且,還能夠藉助Spring框架的其餘特性。
DI(依賴注入),IOC(控制反轉),AOP(面向切面編程)
IOC:Inversion of Control,控制反轉。在Java開發中,IOC意味着將你設計好的類交給系統去控制,而不是在你的類內部控制,這稱爲控制反轉,就是被調用類的實例由原先的調用類控制建立、銷燬如今轉變成由Spring的容器管理。
建立:<bean name=」」 class=」」 額外屬性>
初始化:配置init-method/實現接口InitializingBean
調用:context.getBean(),進行方法的調用
銷燬:配置destroy-method/實現DisposableBean接口
注入方式:
接口注入
屬性注入[屬性的SET/GET]
構造注入[構造方法注入]
使用構造函數依賴注入時,Spring保證全部一個對象全部依賴的對象先實例化後,才實例化這個對象。使用set方法依賴注入時,Spring首先實例化對象,而後才實例化全部依賴的對象。
當設值注入與構造注入同時存在時,先執行設置注入,在執行構造注入。
使用DI注入時,Property表明注入類的屬性,若是應用其餘的bean用ref屬性來代表被引用bean的名稱,若是是引用字符串的話,用value屬性。如:
<property name=」userDao」 ref=」被引用bean的名稱」 />
<property name=」username」 value = 「字符串」/>
四種方式,以下:
1:DBCP數據源
DBCP類包位於 <SPRING_HOME>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴Jakarta commons-pool對象池機制的數據庫鏈接池,因此在類路徑下還必須包括<SPRING_HOME>/lib/jakarta-commons/commons-pool.jar。下面是使用DBCP配置oracle數據源的配置片段:
<bean id=」dataSource」 class=」org.apache.commons.dbcp.BasicDataSource」 destroy-method=」close」> <property name=」driverClassName」 value=」 oracle.jdbc.driver.OracleDriver 」 /> <property name=」url」 value=」jdbc:oracle:thin:@localhost:1521:orcl 」 /> <property name=」username」 value=」root」 /> <property name=」password」 value=」1234″ /> </bean>
2:C3P0數據源
C3P0是一個開放源代碼的JDBC數據源實現項目,它在lib目錄中與Hibernate一塊兒發佈,實現了JDBC3和JDBC2擴展規範說明的Connection 和Statement 池。C3P0類包位於<SPRING_HOME>/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一個Oracle數據源:
<bean id=」dataSource」 class=」com.mchange.v2.c3p0.ComboPooledDataSource」 destroy-method=」close」> <property name=」driverClassName」 value=」 oracle.jdbc.driver.OracleDriver 」 /> <property name=」url」 value=」jdbc:oracle:thin:@localhost:1521:orcl 」 /> <property name=」username」 value=」root」 /> <property name=」password」 value=」1234″ /> </bean>
3. Spring的數據源實現類(DriverManagerDataSource)
Spring自己也提供了一個簡單的數據源實現類DriverManagerDataSource ,它位於org.springframework.jdbc.datasource包中。這個類實現了javax.sql.DataSource接口,但它並無提供池化鏈接的機制,每次調用getConnection()獲取新鏈接時,只是簡單地建立一個新的鏈接。所以,這個數據源類比較適合在單元測試或簡單的獨立應用中使用,由於它不須要額外的依賴類。
<bean id=」dataSource」 class=」org.springframework.jdbc.datasource.DriverManagerDataSource」 destroy-method=」close」> <property name=」driverClassName」 value=」 oracle.jdbc.driver.OracleDriver 」 /> <property name=」url」 value=」jdbc:oracle:thin:@localhost:1521:orcl 」 /> <property name=」username」 value=」root」 /> <property name=」password」 value=」1234″ /> </bean>
4.獲取JNDI數據源
若是應用配置在高性能的應用服務器(如WebLogic或Websphere等)上,咱們可能更但願使用應用服務器自己提供的數據源。應用服務器的數據源使用JNDI開放調用者使用,Spring爲此專門提供引用JNDI資源的JndiObjectFactoryBean類。下面是一個簡單的配置:
<bean id=」dataSource」 class=」org.springframework.jndi.JndiObjectFactoryBean」> <property name=」jndiName」 value=」java:comp/env/jdbc/oracle」/> </bean>
經過jndiName指定引用的JNDI數據源名稱。
注入DataSource數據源對象
不要手動關閉數據庫鏈接,JdbcTemplate會幫咱們關閉數據庫鏈接
每個對象爲java.util.Map類型的數據,EL表達式裏用<c:foreach>取值
AOP的概念是Aspected Oriented Programming 面身向方面編程。
好處:AOP將程序分解成各個方面或者說關注點。這使得能夠模塊化,至關橫向上分切了。它能夠解決OOP和過程化方法不可以很好解決的橫切(crosscut)問題,如:事務、安全、日誌等橫切關注
實現AOP有幾種方式:
1. Spring 1.2版本中經過ProxyFactoryBean來實現aop,即經過動態代理來實現的,Aspect必須繼承MethodBeforeAdvice,MethodAfterAdvice等
2. Spring 2.0 AOP須要改的是FBI 這個類,並且它也不須要再實現某些接口
3. 三使用標註(@AspectJ)實現AOP
spring提供的事務管理能夠分爲兩類:編程式的和聲明式的。
編程式的,比較靈活,可是代碼量大,存在重複的代碼比較多;
聲明式的比編程式的更靈活.
總接口
PlatformTransactionManager接口,
核心類:
不能。Spring的聲明式事務爲實現類產生代理。不能在代碼中使用Try/Catch,由於代碼中捕獲了異常,Spring容器捕獲不了異常。
<bean name=」baseTransactionProxy」 class=」org.springframework.transaction.interceptor.TransactionProxyFactoryBean」> <!– 爲事務代理bean注入事務管理器–> <property name=」transactionManager」 ref=」transactionManager」> </property><!– 設置事務屬性–> <property name=」transactionAttributes」> <props><!– 全部方法採用required的事務策略 -> <prop key=」*」>PROPAGATION_REQUIRED</prop> </props> </property><!– 爲事務代理bean設置目標bean –> <property name=」target」 ref=」userDao」> </property> </bean><!– 目標bean –> <bean name=」userDao」 class=」com.dao.userDao」> <property name=」dataSource」 ref=」dataSource」 /></property> </bean>