美文网首页spring4.x
Spring4新特性简述

Spring4新特性简述

作者: 不迷失 | 来源:发表于2016-05-14 10:43 被阅读2149次

    Spring是一个java世界中极其流行的开源框架。Spring的初衷是降低企业级开发的复杂性,并试图通过POJO对象实现之前EJB这类重型框架才能实现的功能。Spring不仅仅对服务端开发有用,任何Java应用都可受益于Spring的简洁、易测试和低耦合等特性。
    Spring框架中使用beansJavaBeans来表示应用程序中的组件,但这并不意味着该组件必须严格满足Java Bean的规范。
    Spring做了很多事情,但是归根到底是一些基本的思路,而所有这些思路最终都导向Spring的使命:简化Java开发
    Spring通过下列四种策略来简化Java开发:
    基于POJO的轻量级、最小侵入式开发;
    通过依赖注入和面向接口编程实现松耦合;
    通过面向切面编程和惯例实现声明式编程;
    通过面向切面编程和模板消除样板式代码
    按照功能划分,这些模块可以分成六组,如下图所示:

    这些模块几乎可以满足所有企业级应用开发的需求,但是开发人员并不需要完全使用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;

    对于map,会将所有类型为MyService的bean以bean的name为key注入到map
    对于list,会注入所有MyService类型的bean
    基于CGLIB的类代理不再要求类必须有空参构造器了:
    这是一个很好的特性,使用构造器注入有很多好处,比如可以只在创建Bean时注入依赖,然后就不变了,如果使用setter注入,是允许别人改的.
    WEB开发增强
    为了方便Rest开发,通过新的@RestController指定在控制器上,这样就不需要在每个@RequestMapping方法上加@ResponseBody了。而且添加了一个AsyncRestTemplate,支持REST客户端的异步无阻塞支持.

    @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用于客户端非阻塞异步支持。
    服务器端

    @RestController
    public class UserController {
        private UserService userService;
        @Autowired
        public UserController(UserService userService) {
            this.userService = userService;
        }
        @RequestMapping("/api")
        public Callable api() {
            System.out.println("=====hello");
            return new Callable() {
                @Override
                public User call() throws Exception {
                    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和依赖注入、分组转换等。
    其他的一些改进:
    1、核心部分基本上无变化,提供了DirectFieldAccessor用于直接字段访问、yaml配置、SpEL的字节码编译化、BackOff退避算法的基本实现、Base64Utils、SmartInitializingSingleton等;
    2、在任务调度和事件机制上加入了异常处理部分;
    3、cache部分加入jcache的集成、类级别的@CacheConfig的支持、CacheResolver;
    4、mvc部分提供了一些视图解析器的mvc标签实现简化配置、提供了GroovyWebApplicationContext用于Groovy web集成、提供了Gson、protobuf的HttpMessageConverter、静态资源处理方面添加了resolver和transformer、提供了对groovy-templates模板的支持、JSONP的支持、对Jackson的@JsonView的支持等;
    5、提供了页面自动化测试框架Spring MVC Test HtmlUnit;
    6、test部分提供了更便利的@sql标签来执行测试脚本的初始化、MockRestServiceServer对AyncRestTemplate支持、MockMvcConfigurer来全局配置MockMvc;
    7、提供了对Java8 Optional的支持(ObjectToOptionalConverter实现;可以在MVC中如@RequestParam等注解的绑定)、从Spring 4.1起Ehcache支持需要EhCache 2.5或更高版本、兼容Quartz 2.1.4、支持javax.annotation.Priority(等价于@Order)、JMS API的增强、SpringJUnit4ClassRunner需要 JUnit 4.9或更高版本支持。
    总体来说没有大的变化,只是一些增强,因此我们升级是很容易的。

    部分内容参考 http://www.jianshu.com/p/9370707091ef
    微信公众号: java技术
    技术交流群: 245130488

    相关文章

      网友评论

      • 程序猿_小刚:1m11mam1t 😜😊👎😜😊😓😊👎😊😒😊👎😊👎😊😂😊☝😝😉😏😚😓😓👎😡😉😏😞😏😂😊😊😜😊😊😊😭😊😊😊😡😜😊😊😜😞😜😂😊😜😚😡😜😚😘😜✌😜😊😊😊👎👩😳😊👆😊😊😂😜✌😜👎😜😜😞👘👸:P 11WM1WG1W11TGGWD1AWA 1GW1gamwat d1gwmgtgggtjWJGtapmgta1 3G2919132432 6434.81196240242261.29:P91 1924
        24169524.9252.29799292962.:P861.291492946296.79626629917929191962.262.191492 52166:P992862919249101929629316692 191 1951.:P9268249949:P2618)82 1452614923:P9629296294_926292926666149292629299

      本文标题:Spring4新特性简述

      本文链接:https://www.haomeiwen.com/subject/eavmrttx.html