Spring 框架中核心組件有三個:Core、Context 和 Beans。其中最核心的組件就是Beans, Spring提供的最核心的功能就是Bean Factory。
Spring 解決了的最核心的問題就是把對象之間的依賴關系轉為用配置文件來管理,也就是Spring的依賴注入機制。這個注入機制是在Ioc 容器中進行管理的。
Bean 組件是在 Spring 的 org.springframework.beans 包下。這個包主要解決了如下功能:Bean 的定義、Bean 的創建以及對 Bean 的解析。對 Spring 的使用者來說唯一需要關心的就是 Bean 的創建,其他兩個由 Spring 內部機制完成。Spring Bean 的創建采用典型的工廠模式,他的頂級接口是 BeanFactory。
BeanFactory 有三個子類:ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory。但是從上圖中我們可以發現最終的默認實現類是 DefaultListableBeanFactory,他實現了所有的接口。那為何要定義這么多層次的接口呢?查閱這些接口的源碼和說明發現,每個接口都有他使用的場合,它主要是為了區分在 Spring 內部在操作過程中對象的傳遞和轉化過程中,對對象的數據訪問所做的限制。例如 ListableBeanFactory 接口表示這些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是這些 Bean 是有繼承關系的,也就是每個 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定義 Bean 的自動裝配規則。這四個接口共同定義了 Bean 的集合、Bean 之間的關系、以及 Bean 行為。
Bean 的定義就是完整的描述了在 Spring 的配置文件中你定義的 <bean/> 節點中所有的信息,包括各種子節點。當 Spring 成功解析你定義的一個 <bean/> 節點后,在 Spring 的內部他就被轉化成 BeanDefinition 對象。以后所有的操作都是對這個對象完成的。Bean 的解析過程非常復雜,功能被分的很細,因為這里需要被擴展的地方很多,必須保證有足夠的靈活性,以應對可能的變化。Bean 的解析主要就是對 Spring 配置文件的解析。
Spring框架分為哪七大模塊,各模塊的主要功能作用是什么七大模塊,如下:
1.SpringCore:Core封裝包是框架的最基礎部分,提供IOC和依賴注入特性。這里的基礎概念是BeanFactory,它提供對Factory模式的經典實現來消除對程序性單例模式的需要,并真正地允許你從程序邏輯中分離出依賴關系和配置。
2.SpringContext: 構建于Core封裝包基礎上的Context封裝包,提供了一種框架式的對象訪問方法,有些象JNDI注冊器。Context封裝包的特性得自于Beans封裝包,并添加了對國際化(I18N)的支持(例如資源綁定),事件傳播,資源裝載的方式和Context的透明創建,比如說通過Servlet容器。
3.SpringDAO:DAO(DataaccessObject)提供了JDBC的抽象層,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。并且,JDBC封裝包還提供了一種比編程性更好的聲明性事務管理方法,不僅僅是實現了特定接口,而且對所有的POJOs(plainoldjavaobjects)都適用。
4.SpringORM:ORM封裝包提供了常用的“對象/關系”映射APIs的集成層。其中包括JPA、JDO、Hibernate和iBatis。利用ORM封裝包,可以混合使用所有Spring提供的特性進行“對象/關系”映射,如前邊提到的簡單聲明性事務管理。
5.SpringAOP: Spring的AOP封裝包提供了符合AOPAlliance規范的面向方面的編程實現,讓你可以定義,例如方法攔截器(method-interceptors)和切點(pointcuts),從邏輯上講,從而減弱代碼的功能耦合,清晰的被分離開。而且,利用source-level的元數據功能,還可以將各種行為信息合并到你的代碼中。
6.SpringWeb: Spring中的Web包提供了基礎的針對Web開發的集成特性,例如多方文件上傳,利用Servletlisteners進行IOC容器初始化和針對Web的applicationContext。當與WebWork或Struts一起使用Spring時,這個包使Spring可與其他框架結合。
7.SpringWebMVC: Spring中的MVC封裝包提供了Web應用的Model-View-Controller(MVC)實現。Spring的MVC框架并不是僅僅提供一種傳統的實現,它提供了一種清晰的分離模型,在領域模型代碼和WebForm之間。并且,還可以借助Spring框架的其他特性。
DI(依賴注入),IOC(控制反轉),AOP(面向切面編程)
IOC:InversionofControl,控制反轉。在Java開發中,IOC意味著將你設計好的類交給系統去控制,而不是在你的類內部控制,這稱為控制反轉,就是被調用類的實例由原先的調用類控制創建、銷毀現在轉變成由Spring的容器管理。
創建:<beanname=””class=””額外屬性>
初始化:配置init-method/實現接口InitializingBean
調用:context.getBean(),進行方法的調用
銷毀:配置destroy-method/實現DisposableBean接口
注入方式:
接口注入
屬性注入[屬性的SET/GET]
構造注入[構造方法注入]
使用構造函數依賴注入時,Spring保證所有一個對象所有依賴的對象先實例化后,才實例化這個對象。使用set方法依賴注入時,Spring首先實例化對象,然后才實例化所有依賴的對象。
當設值注入與構造注入同時存在時,先執行設置注入,在執行構造注入。
使用DI注入時,Property代表注入類的屬性,如果應用其他的bean用ref屬性來表明被引用bean的名稱,如果是引用字符串的話,用value屬性。如:
<propertyname=”userDao”ref=”被引用bean的名稱”/>
<propertyname=”username”value=“字符串”/>
四種方式,如下:
1:DBCP數據源
DBCP類包位于<SPRING_HOME>/lib/jakarta-commons/commons-dbcp.jar,DBCP是一個依賴Jakartacommons-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的概念是aspectedOrientedProgramming面身向方面編程。
好處:AOP將程序分解成各個方面或者說關注點。這使得可以模塊化,相當橫向上分切了。它可以解決OOP和過程化方法不能夠很好解決的橫切(crosscut)問題,如:事務、安全、日志等橫切關注
實現AOP有幾種方式:
1. Spring1.2版本中通過ProxyFactoryBean來實現aop,即通過動態代理來實現的,Aspect必須繼承MethodBeforeAdvice,MethodAfterAdvice等
2. Spring2.0AOP需要改的是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>
新聞熱點
疑難解答