Spring框架提供了大概20個模組,分類為:Core Container, Data Access/Integration, Web, AOP (Aspect Oriented Programming), Instrumentation, Messaging, and Test。
1、Core Container包含:spring-core, spring-beans, spring-context, spring-context-support, and spring-expression 模組。
①spring-core, spring-beans是Spring框架的基礎,提供了IoC和DI功能。spring-beans中的BeanFactory是工廠模式的實現。
②spring-context模組基於spring-core、spring-beans,是一種框架式訪問物件的方法,類似JNDI註冊方式。
還新增了國際化支援、事件傳播支援、資源載入支援、上下文的建立支援等等。還有JavaEE的部分功能。
ApplicationContext介面是該模組的核心。
③spring-context-support模組則提供了整合通用第三方庫的支援,將其整合到Spring應用上下文中,如快取、郵件、計劃、模板引擎。
④spring-expression模組提供了可在執行時查詢和操作物件圖的表示式語言,很強大。是對JSP中unified EL的擴充套件。
支援:設定/獲取屬性值,屬性分配,方法呼叫,訪問陣列、集合及索引的內容,邏輯和數字運算子,命名變數,通過名字在Spring IoC容器中獲取物件。
2、AOP and Instrumentation包含:
①spring-aop模組提供了AOP程式設計,允許定義方法攔截器和切入點,以與具體的功能程式碼解耦合。
②spring-aspects模組整合了AspectJ。
③spring-instrument模組,提供了類工具支援和類載入器實現,用於特定的應用伺服器。
④spring-instrument-tomcat模組,包含了對tomcat的代理。
3、Messaging
Spring Framework 4 包含了spring-messaging模組,帶有Spring Integration專案的關鍵抽象,如Message、MessageChannel、MessageHandler以及其他,以作為基於訊息的應用的基礎。
也提供了一些註解,可以將訊息傳送到方法中。
4、Data Access/Integration,包含JDBC、ORM、OXM、JMS和Transaction模組。
①spring-jdbc模組,提供了JDBC抽象層,免除了繁雜的JDBC編碼和不同資料庫開發商錯誤程式碼的分析。
②spring-tx模組,允許程式碼式和宣告書事務管理。(需要實現特定介面,支援所有POJO??)
③spring-orm模組,提供了對常見ORM的整合層,常見ORM包括JPA、JDO和Hibernate。通過使用該模組,你既可以使用ORM的功能,也可以使用Spring提供的功能,例如簡單的宣告式事務管理。
④spring-oxm模組,提供了抽象層,支援Object/XML對映實現 如JAXB、Castor、XMLBeans、JiBX和XStream。
⑤spring-jms模組,包含了生產和消費訊息功能,整合了spring-messaging模組。
5、Web,包含spring-web, spring-webmvc, spring-websocket, and springwebmvc-portlet模組。
①spring-web模組,提供了基本的web功能,如檔案上傳、使用Servlet Listeners初始化IoC容器、web容器。同樣包含了一個HTTP客戶端和Spring遠端支援的web部分。
②spring-webmvc模組,包含了MVC和REST Web Service實現。
③spring-webmvc-portlet模組,提供了用於Portlet環境的MVC實現,映象了spring-webmvc模組的功能。
6、Test
spring-test模組,支援Spring元件的單元測試和整合測試,使用JUnit或者TestUG。提供了Spring ApplicationContext的載入及快取。還提供了mock物件!
技巧
通過使用Spring BOM,在 dependencyManagement 匯入spring-framework-bom ,然後就可以保證所有的Spring依賴都是同一個版本 -- 可以不用再宣告版本了。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>4.3.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependencies>
Logging,這是Spring唯一強轉要求的外部依賴,JCL。
關掉JCL:從spring-core模組中排除依賴。或者,選一個依賴取代JCL。
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.3.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
至此,已經破壞了應用(不能執行了),所以還需要修復一下。使用JCL的其他實現例如SLF4J。
SLF4J,是編譯時繫結,而不是執行時判斷,所以更乾淨。(應該是指在編譯時就判斷是否需要相應的程式碼,不需要就去掉)
但是,有一些容器內建了JCL的實現,這時單純的排除依賴是不夠的。這時候最好的辦法是反轉類載入器層次,讓應用控制JCL依賴,而非容器控制。(如IBM的WebSphere Application Server。知道就行,略過。)
4.0 版本的改進(摘錄):
- 注入bean時,支援泛型限定。如 @Autowired Repository<Customer> customerRepository 。
- CGLIB-based proxy classes 不再需要一個預設構造器。
- 新的
@RestController
註解。
4.1 版本的改進(摘錄):
- 用Jackson支援JSONP。
- 新的lifecycle,允許攔截 @ResponseBody 和 @ResponseEntity 方法,在controller返回之後,但寫入響應之前。
- 新的HttpMessageConverter選項:通過 jackson-dataformat-xml擴充套件開啟基於Jackson的XML序列化支援。如果存在 jackson-dataformat-xml,將取代 JAXB2。
4.2 版本的改進(摘錄):
- 可以使用Java 8的預設方法來編寫配置檔案,@Bean 預設方法。
- @Import 支援匯入常規類作為bean,而不僅僅是配置類了。
- 內建的CORs支援,包含全域性的(MVC Java config和 XML namespace)和區域性的(如@CrossOrigin)配置。
- 預設的JSON字首,由 "{} && " 改成更安全的 ")]}', " 。
4.3 版本的改進(摘錄):
- Java 8 的預設方法可以用作bean屬性的GETTER/SETTER。
- 如果目標bean只定義了一個構造方法,就不再需要@Autowired 註解了。
- 內建了對 HTTP HEAD and HTTP OPTIONS 的支援。
-
@RequestMapping 新的組合註解:@
GetMapping
, @PostMapping
, @PutMapping
, @DeleteMapping
, and @PatchMapping
。 -
新的組合註解:@
RequestScope
, @SessionScope
, and @ApplicationScope
。 -
新的 @RestControllerAdvice 註解。
-
新的 @SessionAttribute 和 @RequestAttribute 註解。
-
@
ModelAttribute
allows preventing data binding viabinding=false
attribute (see reference). -
@
PathVariable
may be declared as optional (for use on @ModelAttribute
methods). -
HTTP訊息轉換器中一致的charset處理,包括multipart文字內容預設的UTF-8編碼。
-
靜態資源處理使用配置好的
ContentNegotiationManager
,來決定媒體型別。