`
jinnianshilongnian
  • 浏览: 21513849 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2420496
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3010253
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5640605
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:260219
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597949
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250370
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5860608
Group-logo
跟我学Nginx+Lua开...
浏览量:702885
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785756
社区版块
存档分类
最新评论

Spring4.1新特性——Spring核心部分及其他

阅读更多

目录

Spring4.1新特性——综述

Spring4.1新特性——Spring核心部分及其他

Spring4.1新特性——Spring缓存框架增强

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

Spring 4.1对核心部分没有很亮点的增强,主要还是一些改进和增强;本文将一一道来。

 

1、DirectFieldAccessor

Spring内部大量使用BeanWrapper进行属性取值赋值(setter/getter),不过到目前为止没有简单的办法去获取对象字段值;之前都是通过ReflectionUtils获取Field然后进行操作;Spring 4.1提供了DirectFieldAccessor来完成此功能:

        //嵌套设置/访问对象字段数据
        DirectFieldAccessor accessor = new DirectFieldAccessor(bean);
        //如果嵌套对象为null,字段创建
        accessor.setAutoGrowNestedPaths(true);
        //设置字段值
        accessor.setPropertyValue("bean2.name", "zhangsan");
        //读取字段值
        System.out.println(accessor.getPropertyValue("bean2.name"));

在Spring MVC中也可以通过如下方式给对象字段绑定数据:

    @RequestMapping("/directField")
    public String directFieldInject(MyUser user) {
        System.out.println(user);
        return user.toString();
    }

    @InitBinder
    public void initBinder(DataBinder dataBinder) {
        dataBinder.initDirectFieldAccess();//直接字段访问 必须加这句才可以
    }

 

2、Yaml支持

YAML类似于JSON,做配置文件还是不错的,需要添加org.yaml.snakeyaml依赖。目前支持把YAML文本转换成Map和Properties:

yaml.txt

env:
    one:
        name: zhangsan

    two:
        -   a: 1
            b: 2
        -   c: "3"
            d: 4
    three:

yaml-override.txt

env:
    three: 11

 

配置文件

    <bean id="yamlMap" class="org.springframework.beans.factory.config.YamlMapFactoryBean">
        <property name="resources">
            <list>
                <value>classpath:yaml.txt</value>
                <value>classpath:yaml-override.txt</value>
            </list>
        </property>
        <property name="resolutionMethod" value="FIRST_FOUND"/>
    </bean>

    <bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
        <property name="resources">
            <list>
                <value>classpath:yaml.txt</value>
                <value>classpath:yaml-override.txt</value>
            </list>
        </property>
        <property name="resolutionMethod" value="FIRST_FOUND"/>
    </bean>

 

在应用中使用:

    @Autowired
    private ApplicationContext ctx;

    @Autowired
    @Qualifier("yamlProperties")
    private Properties yamlProperties;
    @Test
    public void testYmlMap() {
        //Map(不能直接注入@Autowired Map)
        //请参考 Map依赖注入(http://jinnianshilongnian.iteye.com/blog/1989379)
        System.out.println(this.yamlMap);
        Map<String, Object> yamlMap = ctx.getBean("yamlMap", Map.class);
        //需要snakeyaml 该功能是从spring-boot引入的
        Map<String, Object> env = (Map<String, Object>) yamlMap.get("env");
        Map<String, Object> one = (Map<String, Object>) env.get("one");
        Assert.assertEquals("zhangsan", one.get("name"));

        List<Map<String, Object>> two = (List) env.get("two");
        Assert.assertEquals(1, two.get(0).get("a"));
        Assert.assertEquals("3", two.get(1).get("c"));

        Assert.assertEquals(null, env.get("three"));


        //Properties
        Assert.assertEquals("zhangsan", yamlProperties.getProperty("env.one.name"));
        //getProperty如果返回的数据时非String的则返回null
        Assert.assertEquals(1, yamlProperties.get("env.two[0].a"));
        Assert.assertEquals("3", yamlProperties.getProperty("env.two[1].c"));
        Assert.assertEquals("", yamlProperties.getProperty("env.three"));


        //spring.profiles
        //http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-yaml
    }

 

该特性是从Spring Boot引入,可以直接参考其文档

 

此处需要注意不能:

    @Autowired
    @Qualifier("yamlMap")
    private Map<String, Object> yamlMap;

原因请参考 Map依赖注入(http://jinnianshilongnian.iteye.com/blog/1989379)。

 

3、SmartInitializingSingleton

所有非lazy单例Bean实例化完成后的回调方法:

public class MySmartInitializingSingleton implements SmartInitializingSingleton {
    //所有非lazy单例Bean实例化完成后,会调用该方法
    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("单例Bean实例化完成了");
    }
}

  

4、Base64Utils

其会自动根据反射来决定是使用Java 8 的 java.util.Base64还是Apache Commons Codec的org.apache.commons.codec.binary.Base64。

    @Test
    public void test() {
        //需要Java 8  或 Apache Commons Codec
        String str = "123";
        String str2 = new String(Base64Utils.decodeFromString(Base64Utils.encodeToString(str.getBytes())));
        Assert.assertEquals(str, str2);
    }

 

5、SpEL编译模式

SpEL支持把解释型的SpEL转换为字节码进行编译模式下执行:

    @Test
    public void test() {
        SpelParserConfiguration configuration =
                new SpelParserConfiguration(SpelCompilerMode.MIXED, getClass().getClassLoader());
        SpelExpressionParser parser = new SpelExpressionParser(configuration);

        SpelExpression expression = parser.parseRaw("new String('haha')");
        Assert.assertEquals("haha", expression.getValue());

        //人工编译
        //或者使用expression.compileExpression();
        SpelCompiler spelCompiler = SpelCompiler.getCompiler(getClass().getClassLoader());
        CompiledExpression compiledExpression = spelCompiler.compile((SpelNodeImpl) expression.getAST());
        Assert.assertEquals("haha", compiledExpression.getValue(null, null));
    }

 

SpelCompilerMode.MIXED指定了是混合模式,其在解释型和编译型之间转换, 其编译规则是这样的:

	private void checkCompile(ExpressionState expressionState) {
		this.interpretedCount++;
		SpelCompilerMode compilerMode = expressionState.getConfiguration().getCompilerMode();
		if (compilerMode != SpelCompilerMode.OFF) {
			if (compilerMode == SpelCompilerMode.IMMEDIATE) {//如果立即编译,则直接编译
				if (this.interpretedCount > 1) {//只有当解释的次数大于1时才编译
					compileExpression();
				}
			}
			else {
				// compilerMode = SpelCompilerMode.MIXED
				if (this.interpretedCount > INTERPRETED_COUNT_THRESHOLD) {//混合模式下,需要解释次数达到阀值(默认100)才会编译
					compileExpression();
				}
			}
		}
	}

 

默认情况下,编译模式是禁用的,想要全局开启可以通过配置classpath:spring.properties配置文件,然后SpelParserConfiguration会在类加载时读取spring.expression.compiler.mode属性来配置:

	private static final SpelCompilerMode defaultCompilerMode;

	static {
		String compilerMode = SpringProperties.getProperty("spring.expression.compiler.mode");
		defaultCompilerMode = (compilerMode != null ?
				SpelCompilerMode.valueOf(compilerMode.toUpperCase()) : SpelCompilerMode.OFF);
	}

 

5、BackOff退避算法实现

在如连接网络的应用中,网络是不稳定的有时候会连接断开,因此为了保证断开重连接;还有如系统之间互联,相互之间发生消息,如果某个服务器因为不确定因此连接不上,也需要断开重连;则需要一定的规则;常见的规则有:

1、按照固定时间间隔重试,比如100毫秒;这种方式在网络不稳定时重连可能造成某一时间点流量同时发送,阻塞网络;或者造成发送一些无意义的请求;

2、按照指数时间间隔重试,比如刚开始100毫秒,下一次200毫秒等;比如支付宝和第三方集成时就是类似方式。

 

固定时间间隔重试:

    @Test
    public void testFixedBackOff() {
        long interval = 100;
        long maxAttempts = 10;
        BackOff backOff = new FixedBackOff(interval, maxAttempts);
        BackOffExecution execution = backOff.start();

        for(int i = 1; i <= 10; i++) {
            //每次重试时间是100毫秒
            System.out.println(execution.nextBackOff());
        }
        Assert.assertEquals(BackOffExecution.STOP, execution.nextBackOff());
    }

interval是重试间隔,maxAttempts是最大重试次数,如果重试到了maxAttempts,则execution.nextBackOff()=BackOffExecution.STOP。

 

指数时间间隔重试:

    @Test
    public void testExponentialBackOff() {
        long initialInterval = 100;//初始间隔
        long maxInterval = 5 * 1000L;//最大间隔
        long maxElapsedTime = 50 * 1000L;//最大时间间隔
        double multiplier = 1.5;//递增倍数(即下次间隔是上次的多少倍)
        ExponentialBackOff backOff = new ExponentialBackOff(initialInterval, multiplier);
        backOff.setMaxInterval(maxInterval);
        //currentElapsedTime = interval1 + interval2 + ... + intervalN;
        backOff.setMaxElapsedTime(maxElapsedTime);

        BackOffExecution execution = backOff.start();

        for(int i = 1; i <= 18; i++) {
            System.out.println(execution.nextBackOff());
        }
        Assert.assertEquals(BackOffExecution.STOP, execution.nextBackOff());
    }

initialInterval是初始重试间隔,maxInterval是最大的重试间隔, multiplier是递增倍数,maxElapsedTime是重试的最大时长。

 

Spring4新特性

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进 

 

源码下载

https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-others

https://github.com/zhangkaitao/spring4-1-showcase/tree/master/spring4.1-mvc 

 

 

7
1
分享到:
评论
6 楼 jinnianshilongnian 2014-08-15  
njbble 写道
jinnianshilongnian 写道
njbble 写道
看上去基本没有升级的必要哦

在springmvc部分还是有几个不错的特性可以考虑升级

静待【涛~哥】作品~

taoge竟然成敏感词了,哎

哈哈 被屏蔽了
5 楼 jinnianshilongnian 2014-08-15  
hantsy 写道
Spring 4.1 支持 JCache 标准了,所有 JCache Annotations 可以在 Spring 4.1 中直接使用。

我报的一个 BUG 修复了。
https://jira.spring.io/browse/SPR-11233

嗯 目前测试bug很多,我也遇到好几个 还有设计缺陷,测试不严谨
4 楼 hantsy 2014-08-14  
Spring 4.1 支持 JCache 标准了,所有 JCache Annotations 可以在 Spring 4.1 中直接使用。

我报的一个 BUG 修复了。
https://jira.spring.io/browse/SPR-11233
3 楼 njbble 2014-08-14  
jinnianshilongnian 写道
njbble 写道
看上去基本没有升级的必要哦

在springmvc部分还是有几个不错的特性可以考虑升级

静待【涛~哥】作品~

taoge竟然成敏感词了,哎
2 楼 jinnianshilongnian 2014-08-14  
njbble 写道
看上去基本没有升级的必要哦

在springmvc部分还是有几个不错的特性可以考虑升级
1 楼 njbble 2014-08-14  
看上去基本没有升级的必要哦

相关推荐

    spring4.1.5、4.3.15、4.3.24版本使用的jar包

    5. **Spring的未来**:尽管这些版本已经较旧,但它们仍然是许多遗留系统的核心组成部分。随着Spring的发展,新的版本如Spring 5.x和6.x带来了更多的特性,如对Java 11+的支持、响应式编程模型、Kubernetes集成等。...

    Spring4.X最新帮助文档带视图结构树的

    - **介绍:** 对Spring框架进行了全面而深入的介绍,包括其设计理念、核心特性及应用场景。 - **知识点:** - **依赖注入与控制反转:** 解释了DI(Dependency Injection)的概念及其在Spring中的实现方式——IoC...

    跟开涛学Spring

    1.33 【第七章】 对JDBC的支持 之 7.4 Spring提供的其它帮助 ——跟我学spring3【私塾在线原 创】 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....

    Spring框架原理及详细搭建步骤

    接着,我们将深入探讨Spring的核心原理——控制反转和依赖注入。此外,我们还将学习如何在Spring框架中配置数据库JDBC,并整合SpringMVC。最后,我们将详细介绍Spring的搭建流程,包括环境搭建、项目结构设计以及...

    spring in action 英文原版

    - **依赖注入**:Spring的核心特性之一是依赖注入(DI),它使得开发者能够更加灵活地管理对象之间的依赖关系。 - **模块化设计**:Spring提供了多个模块,包括核心容器、数据访问/集成、Web、AOP、测试等,可以根据...

    跟我学spring

    Spring的核心特性可以用于任何Java应用程序,但还有扩展,支持构建Web应用程序。 标题“跟我学spring”和描述“spring 的使用,每个知识点和项目中的运用,20章的介绍。”暗示这是一份详细介绍Spring框架使用方法的...

    spring-roo-docs

    替代教程通过一个具体的例子——婚礼RSVP应用——来展示如何使用SpringRoo。这个例子包括: - 应用概述:描述应用的功能需求。 - 步骤详解:逐步指导如何使用SpringRoo完成应用开发的各个阶段。 - 最终成果:展示...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part3

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    spring+MQ消息队列

    Spring框架是Java开发中的一个核心工具,它提供了丰富的功能来简化企业级应用的开发,包括与各种MQ的集成。在这个“spring+activeMQ消息队列”的主题中,我们将深入探讨Spring如何与ActiveMQ结合使用,以及相关的...

    Spring的IoC容器初始化源码解析

    #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented Programming,面向切面编程),这些功能大大...

    Spring.3.x企业应用开发实战(完整版).part2

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    Spring+Vue2 课堂派

    1.2 IoC(控制反转)与DI(依赖注入):Spring的核心特性之一,通过容器管理对象的生命周期和依赖关系,降低了组件间的耦合度,提高了代码的可测试性和可维护性。 1.3 AOP(面向切面编程):Spring的AOP模块允许...

    SpringBoot下的SpringAOP-day04-源代码

    SpringBoot下的Spring——DAY04——动态代理总结、AOP、自定义注解进行拦截、动态获取注解参数、通知方法 1.动态代理总结 1.1 JDK动态代理特点 1.2 CGlib动态代理 1.2.1 CGLib特点说明 1.3 动态代理的作用 2 Spring...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part2

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    生成一个简单的Spring Boot应用程序.pdf

    这个示例应用将帮助理解Spring Boot的一些核心特性,如自动配置、依赖管理和启动速度等。 #### 重要知识点 1. **Spring Boot简介** - **Spring Boot** 是Spring平台的一个新框架,它简化了基于Spring的应用程序的...

    Struts2框架整合Spring框架在文件上传下载中的应用基于HT T P 传输协议, 采用Struts2 框架整合Spring 框架技术对Web 中文件的上传下载进

    ##### 2.3 Struts2的核心——拦截器 拦截器是Struts2框架中的重要组成部分,它提供了AOP(面向切面编程)的实现方式。拦截器可以被看作是一种在Action前后执行的代码片段,它允许开发者在Action执行前后添加自定义...

    JavaEE开发的颠覆者SpringBoot实战[完整版].part1

    4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 静态资源映射 88 4.4.2 拦截器...

    Spring3.x企业应用开发实战(完整版) part1

     Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...

    基于Spring Boot的网上购物系统设计与实现

    基于Spring Boot的网上购物系统设计与实现是一项重要的技术实践,它结合了现代Web开发的两大主流框架——Spring Boot和Vue.js,构建了一个高效、灵活且易于维护的电商平台。本论文详细探讨了如何利用这些技术来构建...

    Struts2.5+Hibernate3.3+Spring应用开发实例

    这部分将指导学员如何将Spring与Hibernate进行集成,实现事务的统一管理、资源的统一配置,构建一个更为健壮和高效的数据访问层。 #### 四、Struts2+Hibernate+Spring网上购物系统开发 **4.1 网上购物系统设计** ...

Global site tag (gtag.js) - Google Analytics