4.4 Spring常用组件
除了上两节讲述的Spring核心组件和数据操作组件外,Spring还有一些常用的组件。
4.4.1 Spring Expression Language
Spring3引入了Spring Expression Language(SpEL),这是一种在运行时给Bean的属性或者构造函数参数注入值的方法。其具有以下优点:
可以通过Bean的ID引用Bean;
可以调用某个对象的方法或者访问它的属性;
支持数学、关系和逻辑操作;
正则表达式匹配;
支持集合操作
SpEL表达式被#{}包围,跟placeholders中的#{}非常像,最简单的SpEL表达式可以写作#{1}。以下是几个例子。
#{T(System).currentTimeMillis()} : 这个表达式负责获得当前的系统时间,T()操作符负责将java.lang.System解析成类,以便可以调用currentTimeMillis()方法或者访问其静态变量。
#{systemProperties['spring.profile']}: 引用系统属性spring.profile
#{adminUser.userName}: 引用id为adminUser的属性userName
#{adminUser.getUserName()?.toUpperCase()}: 调用adminUser的getUserName方法,这里的?的作用是防止getUserName的返回值为null。
#{adminUser.noteList.![title]}: 把adminUser的noteList中每一个note的title都提取出来构成一个新的字符串集合。
引用Spring EL的这些值可以通过@Value注解。
public UserService(
@Value("#{adminUser.userName}")
private String adminUserName;
...
}此外,也可以使用代码做EL解析和执行。
4.4.2 Spring Remoting
Spring Web提供了几种远程服务的封装,基本都是一个ServiceExporter用来发布服务,一个ProxyFactoryBean来引用服务。
RMI:对Java自带RMI机制的封装,包括RmiServiceExporter和RmiProxyFactoryBean。
Spring HTTP invoker:Spring自己实现的一种基于HTTP协议使用Java的序列化机制的RPC方式。包括HttpInvokerProxyFactoryBean和HttpInvokerServiceExporter
Hessian:Hessian协议的封装使用,包括HessianProxyFactoryBean和HessianServiceExporter。
Burlap: Burlap是一种基于XML的RPC协议,包括BurlapProxyFactoryBean和BurlapServiceExporter.
对于这些远程服务封装的使用,基本是类似的:

4.4.3 Spring与JMX的集成
Java管理扩展(Java Management Extension,JMX)从Java5.0开始引入,提供连接、监控和管理远程JVM的方式。如果一个 Java对象可以由一个遵循 JMX 规范的管理器应用管理,那么这个Java对象就可以称为一个可由JMX管理的资源。使用Spring与JMX集成,实现方式灵活而且简单:
可以自动探测实现MBean接口的MBean对象,而且可以将一个普通的Spring Bean注册为MBean;
定制管理MBean的接口,根据需要暴露特定管理MBean的操作;
使用注解定义MBean管理接口;
可以实现对本地和远程MBean的代理。
声明MBean。
配置并暴露服务。
以上便在9999端口开放了JMX协议并发布了一个MBean,其底层通讯是基于RMI的。这样通过serviceUrl:"service:jmx:rmi:///jndi/rmi://127.0.0.1:9099/kmconnector"以及mbeanName:"suishen.libs.admin.jmx.impl:name=AdminBean"即可调用服务。
4.4.4 Spring Quartz
Spring Quartz是Spring自己实现的一套定时调度框架,支持Cron表达式。需要注意的是相比起真正的Quartz框架,Spring Quartz是轻量级的,缺乏分布式等高级特性。
典型的使用Spring Quartz的XML配置如下:
其中task:scheduler配置了Quartz使用的scheduler的线程池大小为10。配置的任务则是每5分钟执行userDisableService这个Bean的enableService方法。
当然,Spring Quartz也支持注解配置,开关如下:
当然,也可以使用@注解EnableScheduling来开启Spring Quartz的注解支持。
这样就可以在bean中使用@Scheduled注解来配置定时任务。
4.4.5 Spring CORS
CORS(Cross-Origin Resource Sharing)是为了解决浏览器中跨域请求的问题。简单的Get请求可以使用JSONP解决,而对于其他稍微复杂的请求则需要后端应用支持CORS。Spring4.2之后提供了@CrossOrigin注解实现对CORS的支持。
在Controller方法上配置
在Controller上配置,那么此Controller中所有的method都支持CORS
Java Config全局配置
XML全局配置
Spring Boot中的Filter全局配置
这里需要注意的是,使用此种方式配置cors,实质上是Spring在handler中加入了一个CorsInterceptor,而这个拦截器其执行是在自定义的拦截器后面的。因此如果跨域请求被前面的拦截器拦住了,那么不会走到CorsInterceptor,会报跨域错误。
Last updated