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

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

阅读更多

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

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

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

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

Spring4新特性——Groovy Bean定义DSL

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

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

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

 

一、注解方面的改进

spring4对注解API和ApplicationContext获取注解Bean做了一点改进。

获取注解的注解,如@Service是被@Compent注解的注解,可以通过如下方式获取@Componet注解实例:

Annotation service = AnnotationUtils.findAnnotation(ABService.class, org.springframework.stereotype.Service.class);
Annotation component = AnnotationUtils.getAnnotation(service, org.springframework.stereotype.Component.class);

 

获取重复注解:

比如在使用hibernate validation时,我们想在一个方法上加相同的注解多个,需要使用如下方式:

@Length.List(
        value = {
                @Length(min = 1, max = 2, groups = A.class),
                @Length(min = 3, max = 4, groups = B.class)
        }
)
public void test() {

可以通过如下方式获取@Length:

Method method = ClassUtils.getMethod(AnnotationUtilsTest.class, "test");
Set<Length> set = AnnotationUtils.getRepeatableAnnotation(method, Length.List.class, Length.class);

 

当然,如果你使用Java8,那么本身就支持重复注解,比如spring的任务调度注解,

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled { 
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Schedules {

	Scheduled[] value();

}

 

这样的话,我们可以直接同时注解相同的多个注解:

@Scheduled(cron = "123")
@Scheduled(cron = "234")
public void test   

但是获取的时候还是需要使用如下方式:

AnnotationUtils.getRepeatableAnnotation(ClassUtils.getMethod(TimeTest.class, "test"), Schedules.class, Scheduled.class)

 

ApplicationContext和BeanFactory提供了直接通过注解获取Bean的方法:

    @Test
    public void test() {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(GenericConfig.class);
        ctx.refresh();

        Map<String, Object> beans = ctx.getBeansWithAnnotation(org.springframework.stereotype.Service.class);
        System.out.println(beans);
    }

这样可以实现一些特殊功能。

 

另外和提供了一个AnnotatedElementUtils用于简化java.lang.reflect.AnnotatedElement的操作,具体请参考其javadoc。   

 

二、脚本的支持 

spring4也提供了类似于javax.script的简单封装,用于支持一些脚本语言,核心接口是:

public interface ScriptEvaluator {
	Object evaluate(ScriptSource script) throws ScriptCompilationException;
	Object evaluate(ScriptSource script, Map<String, Object> arguments) throws ScriptCompilationException;
}

 

比如我们使用groovy脚本的话,可以这样:

    @Test
    public void test() throws ExecutionException, InterruptedException {
        ScriptEvaluator scriptEvaluator = new GroovyScriptEvaluator();

        //ResourceScriptSource 外部的
        ScriptSource source = new StaticScriptSource("i+j");
        Map<String, Object> args = new HashMap<>();
        args.put("i", 1);
        args.put("j", 2);
        System.out.println(scriptEvaluator.evaluate(source, args));
    }

没什么很特别的地方。另外还提供了BeanShell(BshScriptEvaluator)和javax.script(StandardScriptEvaluator)的简单封装。

 

三、Future增强

提供了一个ListenableFuture,其是jdk的Future的封装,用来支持回调(成功/失败),其借鉴了com.google.common.util.concurrent.ListenableFuture。

    @Test
    public void test() throws Exception {
        ListenableFutureTask<String> task = new ListenableFutureTask<String>(new Callable() {
            @Override
            public Object call() throws Exception {
                Thread.sleep(10 * 1000L);
                System.out.println("=======task execute");
                return "hello";
            }
        });

        task.addCallback(new ListenableFutureCallback<String>() {
            @Override
            public void onSuccess(String result) {
                System.out.println("===success callback 1");
            }

            @Override
            public void onFailure(Throwable t) {
            }
        });

        task.addCallback(new ListenableFutureCallback<String>() {
            @Override
            public void onSuccess(String result) {
                System.out.println("===success callback 2");
            }

            @Override
            public void onFailure(Throwable t) {
            }
        });

        ExecutorService executorService = Executors.newSingleThreadExecutor();
        executorService.submit(task);
        String result = task.get();
        System.out.println(result);

    }

可以通过addCallback添加一些回调,当执行成功/失败时会自动调用。

 

四、MvcUriComponentsBuilder

MvcUriComponentsBuilder类似于ServletUriComponentsBuilder,但是可以直接从控制器获取URI信息,如下所示:

假设我们的控制器是:

@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/{id}")
    public String view(@PathVariable("id") Long id) {
        return "view";
    }

    @RequestMapping("/{id}")
    public A getUser(@PathVariable("id") Long id) {
        return new A();
    }

}

注:如果在真实mvc环境,存在两个@RequestMapping("/{id}")是错误的。当前只是为了测试。

 

我们可以通过如下方式得到

    //需要静态导入 import static org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.*;
    @Test
    public void test() {
        MockHttpServletRequest req = new MockHttpServletRequest();
        RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(req));

        //MvcUriComponentsBuilder类似于ServletUriComponentsBuilder,但是直接从控制器获取
        //类级别的
        System.out.println(
                fromController(UserController.class).build().toString()
        );

        //方法级别的
        System.out.println(
                fromMethodName(UserController.class, "view", 1L).build().toString()
        );

        //通过Mock方法调用得到
        System.out.println(
                fromMethodCall(on(UserController.class).getUser(2L)).build()
        );
    }
}

注意:当前MvcUriComponentsBuilder实现有问题,只有JDK环境支持,大家可以复制一份,然后修改:

method.getParameterCount() (Java 8才支持)

method.getParameterTypes().length

 

五、Socket支持

提供了获取Socket TCP/UDP可用端口的工具,如

SocketUtils.findAvailableTcpPort()

SocketUtils.findAvailableTcpPort(min, max) 

SocketUtils.findAvailableUdpPort()

非常简单,就不用特别说明了。

 

示例代码请参考:spring4-others

 

到此,spring4新特性就介绍完了,此处没有介绍websocket,后续有时间考虑写一个websocket完整系列,对于spring4除了websocket,其他方面并没有特别吸引人的功能。

 

 

11
4
分享到:
评论
13 楼 shicrazystone 2015-09-30  
[flash=200,200][url][img][list]
[*]
[quo :roll:  :?: te][u][i][/i][/u]
[/list][/img][/url][/flash]
12 楼 向左走向右走 2015-04-16  
问个问题,为啥再使用maven创建的spring后的例子里面有个方法 pringWelcome,把这个名称改为其他的 ,就会运行出错

@Controller
@RequestMapping("/")
public class HelloController {
@RequestMapping(method = RequestMethod.GET)
public String printWelcome(ModelMap model) {
model.addAttribute("message", "Hello Qeeniao! I am");
return "hello";//之所以返回hello是因为要渲染hello.jsp文件,不然会找不到的
}
}

代码是这样的
11 楼 qingbo921 2014-04-20  
Spring4 被大侠形容的不是那么新鲜哦,没什么新特性,在项目中,spring 验证这种方式完全忽略,本人是不会这么去干的,感觉spring越来不肥胖了,其实肥胖了,并不是那么好,大侠觉得呢???  
10 楼 jinnianshilongnian 2013-12-25  
gao2008ss 写道
不错。。坐等websocket系列

哈哈,这个可能久点
9 楼 gao2008ss 2013-12-25  
不错。。坐等websocket系列
8 楼 jinnianshilongnian 2013-12-25  
放羊的boy 写道
       

7 楼 jinnianshilongnian 2013-12-25  
Credo 写道
jinnianshilongnian 写道
peak 写道
spring 4 基本可以不用xml才是最爽的地方,包括web.xml,也是可以用servlet3.0的jar来全java实现

spring3就可以做到 配合servlet3
之前写过:
https://github.com/zhangkaitao/servlet3-showcase

是可以,但感觉乖乖的。觉得少量的XML配置还是比较好的。

是的,我还是喜欢把事务等的放到配置文件;不过如果项目比较小,直接全注解也无妨(比如直接使用spring boot来开项目)
6 楼 放羊的boy 2013-12-25  
       
5 楼 Credo 2013-12-25  
jinnianshilongnian 写道
peak 写道
spring 4 基本可以不用xml才是最爽的地方,包括web.xml,也是可以用servlet3.0的jar来全java实现

spring3就可以做到 配合servlet3
之前写过:
https://github.com/zhangkaitao/servlet3-showcase

是可以,但感觉乖乖的。觉得少量的XML配置还是比较好的。
4 楼 jinnianshilongnian 2013-12-25  
peak 写道
spring 4 基本可以不用xml才是最爽的地方,包括web.xml,也是可以用servlet3.0的jar来全java实现

spring3就可以做到 配合servlet3
之前写过:
https://github.com/zhangkaitao/servlet3-showcase
3 楼 peak 2013-12-25  
spring 4 基本可以不用xml才是最爽的地方,包括web.xml,也是可以用servlet3.0的jar来全java实现
2 楼 jinnianshilongnian 2013-12-25  
zhangping2056 写道
 

1 楼 zhangping2056 2013-12-25  
 

相关推荐

    Spring4新特性(8)注解脚本任务MVC等其他特性改进

    Spring4新特性(8)注解脚本任务MVC等其他特性改进Java开发Java经验技巧共7页.pdf.zip

    myEclipse2013+spring-mvc+mybatis3.2.2实现增删改查简单完整版

    myEclipse2013+spring-mvc+mybatis3.2.2实现增删改查简单完整版,可在myEclipse2013自带的Tomcat 7上运行,weblogic上可能有问题,有ModelMap 和ModelAndView的简单使用比较,ModelMap用起来更方便简洁。也使用到了c...

    Spring 2.0 开发参考手册

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

    基于SSM框架(SpringMVC + Spring + Mybatis)的图书管理系统,内附,教程,数据库脚本

    1 此系统采用了目前最流行的ssm框架,其中的spingMVC框架相对于struts2框架更灵活,更安全。 2 本项目springMVC框架采用了注解映射器,使用了...5 spring容器内部使用拦截器,以Spring AOP的方式实现事务控制管理。

    Spring中文帮助文档

    2.5.1. Spring MVC合理的默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation的控制器 2.5.4. Spring MVC的表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的...

    spring chm文档

    2. Spring 2.0 的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 更简单的XML配置 2.2.2. 新的bean作用域 2.2.3. 可扩展的XML编写 2.3. 面向切面编程(AOP) 2.3.1. 更加简单的AOP XML配置 2.3.2. 对@...

    Spring MVC温故而知新系列教程之请求映射RequestMapping注解

    主要介绍了Spring MVC温故而知新系列教程之请求映射RequestMapping注解的相关知识,文中给大家介绍了RequestMapping注解提供的几个属性及注解说明,感兴趣的朋友跟随脚本之家小编一起学习吧

    Spring攻略(第二版 中文高清版).part1

    第4章 Spring中的脚本 152 4.1 用脚本语言实现Bean 152 4.1.1 问题 152 4.1.2 解决方案 153 4.1.3 工作原理 153 4.2 将Spring Bean注入脚本中 157 4.2.1 问题 157 4.2.2 解决方案 157 4.2.3 工作...

    Spring攻略(第二版 中文高清版).part2

    第4章 Spring中的脚本 152 4.1 用脚本语言实现Bean 152 4.1.1 问题 152 4.1.2 解决方案 153 4.1.3 工作原理 153 4.2 将Spring Bean注入脚本中 157 4.2.1 问题 157 4.2.2 解决方案 157 4.2.3 工作...

    基于JAVA_SSM的毕业设计——健身房管理系统.rar

    MVC模式、SpringMvc、Mybatis、Spring、HTML、JavaScript、CSS、JQUERY、DWR、Ajax等 系统采用Mybatis框架实现ORM对象关系映射,前台JSP实现,后台springMvc映射,使用Spring框架进行整合。适合学习J2EE的一段时间的...

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP...

    Spring in Action(第二版 中文高清版).part1

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 1.3 理解依赖注入 1.3.1 依赖注入 1.3.2 DI应用 1.3.3 企业级应用中的依赖注入 1.4 应用AOP 1.4.1 AOP介绍 1.4.2 AOP...

    coalsystem

    以用户登录为例说明,其他功能与用户登录类似,只要理解了这条主线,其他功能模块的前后台交互基本都是一样的,无非就是数据库的增删改查。 1.从应用的配置文件web.xml中可以看出,该项目使用到了Spring-MVC框架,...

    企业后台管理基础框架 hsweb.zip

    演示示例:demo.hsweb.me测试用户:test (test2,test3,test4....) 密码:123456演示项目源码:hsweb-demo技术选型第三方:MVC:spring-boot. 开箱即用,学习成本低,部署方便(main方法运行).ORM:mybatis. 配置灵活,简单方便...

    使用SpringMVC +注解 制作的增删改查,大量的注释,以及一个前端项目

    本资料采用MyEclipse 10所编写,使用SpringMVC +注解 制作的增删改查,大量的注释,并且都赋有sql脚本,项目可以直接跑起来。使用技术有很多大家可以下来看看。

    javaSE代码实例

    第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全形式 43 4.1.3 语句的嵌套 43 4.2 switch多分支语句 45 4.2.1 基本语法 45 4.2.2 合法的判断表达式 46 ...

    基于springboot的设备管理系统+源代码+文档说明

    **项目说明** - 采用SpringBoot、MyBatis...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    java抢红包源码-rest-api:基于spring-boot的rest风格的基础框架,整合mysql,oracle,redis,mongo

    增加mvc 拦截器; 2016-09-09 spring-boot增加session保存Redis spring-boot-redis 集群测试 OK. 2016-08-19 支持domain 多包扫描; 增加部分注解; 2016-08-05 注销mongo 的异步调用; 注销redis and mongo 的调用...

Global site tag (gtag.js) - Google Analytics