以前都没读过优秀框架的源码,现在做些尝试,把解读效果总结出来,分享出来
Spring Mobile 是spring project下的一个子项目,前几天刚看到有这个,了解了下,说的是做 视图层的适配用的,刚好现在业务有这个需要,顺便拿来用了下。顺便总结下
spring mobile 主要做了三件事情
1:识别客户端类型, 手机,平板,pc ,android, iphone
2:设置设备类型到请求方法参数里
3:根据客户端类型+视图路径解析,跳转到对应客户端视图
首先,导入spring moble核心包 spring-mobile-device
<dependency> <groupId>org.springframework.mobile</groupId> <artifactId>spring-mobile-device</artifactId> <version>2.0.0.M2</version> </dependency>
现在顺着代码和思路一步步讲解
spring mobile 提供了一个拦截器 DeviceResolverHandlerInterceptor , 代码如下
1、DeviceResolverHandlerInterceptor 有一个客户端识别类 deviceResolver,实现类为 LiteDeviceResolver ,由拦截器实例化
2、设置 识别到的客户端信息到request对象中,属性名为 currentDevice
resolveDevice方法实现如下
1、我们可以看到获取的是request请求头信息 User-Agent 的字符串
2、根据是否包含mobile+android等判断客户端的类型+系统
resolveWithPlatform 返回对象
返回一个LiteDevie对象,包含设备类型和系统
好,已经说明了怎么识别的,我们知道它把设备信息放在了request 的currentDevice中,只要把拦截器注入为一个springbean,那么每次请求,该拦截器就会自动识别的
--------------------接下来说使用
spring mobile提供了一个方法参数绑定类 DeviceHandlerMethodArgumentResolver
实现了spring的HandlerMethodArgumentResolver接口,需要把他注入为一个bean,添加到spring 上下文的 argumentResolvers
中去
1、注册为一个bean
2、添加到spirng上下文的argumentResolvers中去,交由spring处理
DeviceHandlerMethodArgumentResolver 类有两个实现方法
1、supportsParameter方法是参数类型的判断,如果参数是Device实现类,返回true
2、resolveArgument方法返回request中设置的对象
在controller中使用
1、我们可以直接在参数里面就可以拿到刚才在request对象里存放的currentDevice 对象,
这里,只分析到了DeviceHandlerMethodArgumentResolver的resolveArgument返回request中设置的Device对象,那么,对象又是如何交由spring处理的呢?
接下来,单独写一篇 spring core 源码解读之controller方法参数绑定 进行后面spring环节处理