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或更高版本支持。整体来讲没有大的变化,只是一些加强,所以咱们升级是很容易的。