Spring是一個java世界中極其流行 的開源框架。Spring的初衷是下降企業級開發的複雜性,並試圖經過POJO對象實現以前EJB這類重型框架才能實現的功能。Spring不只僅對服務 端開發有用,任何Java應用均可受益於Spring的簡潔、易測試和低耦合等特性。
java
Spring框架中使用beans或JavaBeans來表示應用程序中的組件,但這並不意味着該組件必須嚴格知足Java Bean的規範。
Spring作了不少事情,可是歸根究竟是一些基本的思路,而全部這些思路最終都導向Spring的使命:簡化Java開發。
Spring經過下列四種策略來簡化Java開發:
基於POJO的輕量級、最小侵入式開發;
經過依賴注入和麪向接口編程實現鬆耦合;
經過面向切面編程和慣例實現聲明式編程;
經過面向切面編程和模板消除樣板式代碼
按照功能劃分,這些模塊能夠分紅六組,以下圖所示:web
這些模塊幾乎能夠知足全部企業級應用開發的需求,可是開發人員並不須要徹底使用Spring的這些模塊,能夠自由選擇符合項目需求的第三方模塊——Spring爲一些第三方模塊提供了交互接口。
CORE SPRING CONTAINER
Spring框架的核心模塊,其餘全部模塊都基於該模塊構建。Spring容器負責管理Spring應用中bean的建立、配置和管理。在這模塊中有Spring bean factory,該接口提供了最基本的依賴注入(DI)功能;基於bean factory,該模塊提供了集中Spring應用上下文的實現,能夠供開發人員選擇。
除了bean factory和application context,該模塊還支持其餘企業級服務,例如email、JNDI access、EJB integration和scheduling。
SPRING's AOP MODULE
Spring框架經過AOP模塊提供面向切面編程的能力。經過AOP模塊,一些系統層面的需求(事務、安全)能夠與它們真正要做用到的模塊相互解耦合。
DATA ACCESS AND INTEGRATION
Spring的JDBC和data-access object模塊將數據庫操做的一些樣板式代碼封裝起來,免去了開發人員的不少工做量。這個模塊還對數據庫層的異常進行了封裝,並向上提供含義更豐富的異常信息。
Spring並未實現本身的ORM框架,可是它提供了跟其餘幾個ORM框架整合的能力,例如Hibernate、Mybatis、Java Persistence AP等等,並且這些ORM框架都支持使用Spring提供的事務管理模塊。
WEB AND REMOTING
Spring提供了本身的 WEB開發框架——Spring MVC,除此以外,這個模塊還提供遠程調用支持:Remote Method Invocation(RMI)、Hessian、Burlap和JAX-WS。
INSTRUMENTATION
不常使用
TESTING
能夠與經常使用的JUNIT、Mockito、Spock等測試框架整合使用。
spring4新特性
spring4.x不只支持Java8,並且向下兼容到JavaSE6/JavaEE6,並移出了相關廢棄類,新添加如Java8的支持、Groovy式Bean定義DSL、對核心容器進行加強、對Web框架的加強、Websocket模塊的實現、測試的加強等。
這裏簡單列舉下實際中用得多的地方:
支持map,list注入
@Autowired
private Map<String,MyService> map;
@Autowired
算法
private List<MyService> list;spring
對於map,會將全部類型爲MyService的bean以bean的name爲key注入到map
對於list,會注入全部MyService類型的bean
基於CGLIB的類代理再也不要求類必須有空參構造器了:
這是一個很好的特性,使用構造器注入有不少好處,好比能夠只在建立Bean時注入依賴,而後就不變了,若是使用setter注入,是容許別人改的.
WEB開發加強
爲了方便Rest開發,經過新的@RestController指定在控制器上,這樣就不須要在每一個@RequestMapping方法上加@ResponseBody了。並且添加了一個AsyncRestTemplate,支持REST客戶端的異步無阻塞支持.sql
@RestController
public class UserController {
private UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/test")
public User view() {
User user = new User();
user.setId(1L);
user.setName("haha");數據庫return user;
}
}編程
提供AsyncRestTemplate用於客戶端非阻塞異步支持。
服務器端api
@RestController
public classUserController {
private UserService userService;
@Autowired
publicUserController(UserService userService) {
this.userService = userService;
}
@RequestMapping("/api")
publicCallable api() {
System.out.println("=====hello");
return new Callable() {
@Override
publicUser call()throwsException {
Thread.sleep(10L *1000);//暫停兩秒
User user =new User();
user.setId(1L);
user.setName("haha");
return user;
}
};
}
}安全
客戶端服務器
public static void main(String[] args) {
AsyncRestTemplate template =new AsyncRestTemplate();
//調用完後當即返回(沒有阻塞)
Listenable<Future> future= template.getForEntity("http://localhost:9080/spring4/api", User.class);
//設置異步回調
future.addCallback(new ListenableFutureCallback>() {
@Override
public void onSuccess(ResponseEntity result) {
System.out.println("======client get result : "+ result.getBody());
}
@Override
public void onFailure(Throwable t) {
System.out.println("======client failure : "+ t);
}
});
System.out.println("==no wait");
}
此處使用Future來完成非阻塞,這樣的話咱們也須要給它一個回調接口來拿結果; Future和Callable是一對,一個消費結果,一個產生結果。調用完模板後會當即返回,不會阻塞;有結果時會調用其回調.
Bean Validate新特性
支持跨參數驗證(好比密碼和確認密碼的驗證)和支持在消息中使用EL表達式,其餘的還有如方法參數/返回值驗證、CDI和依賴注入、分組轉換等。
其餘的一些改進:
一、核心部分基本上無變化,提供了DirectFieldAccessor用於直接字段訪問、yaml配置、SpEL的字節碼編譯化、BackOff退避算法的基本實現、Base64Utils、SmartInitializingSingleton等;
二、在任務調度和事件機制上加入了異常處理部分;
三、cache部分加入jcache的集成、類級別的@CacheConfig的支持、CacheResolver;
四、mvc部分提供了一些視圖解析器的mvc標籤實現簡化配置、提供了GroovyWebApplicationContext用於Groovy web集成、提供了Gson、protobuf的HttpMessageConverter、靜態資源處理方面添加了resolver和transformer、提供了對groovy-templates模板的支持、JSONP的支持、對Jackson的@JsonView的支持等;
五、提供了頁面自動化測試框架Spring MVC Test HtmlUnit;
六、test部分提供了更便利的@sql標籤來執行測試腳本的初始化、MockRestServiceServer對AyncRestTemplate支持、MockMvcConfigurer來全局配置MockMvc;
七、提供了對Java8 Optional的支持(ObjectToOptionalConverter實現;能夠在MVC中如@RequestParam等註解的綁定)、從Spring 4.1起Ehcache支持須要EhCache 2.5或更高版本、兼容Quartz 2.1.四、支持javax.annotation.Priority(等價於@Order)、JMS API的加強、SpringJUnit4ClassRunner須要 JUnit 4.9或更高版本支持。整體來講沒有大的變化,只是一些加強,所以咱們升級是很容易的。