声明使用缓存的两种方式:
1. 在配置类上添加@EnableCaching注解。
2. 在xml配置文件上添加<cache:annotation-driven />
它们都会创建一个切面并触发Spring缓存注解的切点。根据所使用的注解以及缓存的状态,这个切面会存缓存中获取数据,将数据添加到缓存之中或者从缓存中移除某个值。
还需要声明一个缓存管理器。
缓存管理器是Spring缓存抽象的核心,它能够与多个流行的缓存实现进行集成。
使用Spring的缓存抽象时,最为通用的方式就是在方法上添加@Cacheable和@CacheEvict注解。
@Cacheable
@CachePut
@CacheEvict
@Cacheable首先在缓存中查找条目,如果找到了匹配的条目,那么就不会对方法进行调用了。如果没有找到匹配条目,方法会被调用并且返回值要放到缓存中。而@CachePut并不会在缓存中检查匹配的值,目标方法总是会被调用,并将返回值添加到缓存之中。
@Cacheable和@CachePut有一些属性是共有的,如:
value String[] 要使用的缓存名称。
condition String SpEL表达式,如果得到的值是false的话,不会将缓存应用到方法调用上。
key String SpEL表达式,用来计算自定义的缓存key。
unless String SpEL表达式,如果得到的值是true的话,返回值不会放到缓存之中。
Spring提供了多个用来定义缓存规则的SpEL扩展:
#root.args 传递给缓存方法的参数,形式为数组
#root.caches 该方法执行时所对应的缓存,形式为数组
#root.target 目标对象
#root.targetClass 目标对象的类,是#root.target.class的简写形式
#root.method 缓存方法
#root.methodName 缓存方法的名字,是#root.method.name的简写形式
#result 方法调用的返回值
有时候可能需要使用XML配置缓存,情景如下:
1. 你可能会觉得在自己的源码中添加Spring的注解有点不太舒服;
2. 你需要在没有源码的bean上应用缓存功能。
Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架。Spring Security提供了完整的安全性解决方案,它能够在Web请求级别和方法调用级别处理身份认证和授权。
Spring Security从两个角度来解决安全性问题。它使用Servlet规范中的Filter保护Web请求并限制URL级别的访问。Spring Security还能够使用Spring AOP保护方法调用--借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法。
Spring Security提供了三种不同的安全注解:
1. Spring Security自带的@Secured注解
2. JSR-250的@RolesAllowed注解
3. 表达式驱动的注解,包括@PreAuthorize @PostAuthorize @PreFilter @PostFilter
@Secured和@RolesAllowed方案非常类似,能够基于用户所授予的权限限制对方法的访问。当我们需要在方法上定义更灵活的安全规则时,Spring Securioty提供了@PreAuthorize和@PostAuthorize,而@PreFilter/@PostFilter能够过滤方法返回的以及传入方法的集合。
在Spring中,如果要启用基于注解的方法安全性,关键之处在于要在配置类上使用@EnableGlobalMethodSecurity,如下所示:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled=true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{
}
如果选择使用@RolesAllowed的话,需要将@EnableGlobalMethodSecurity的jsr250Enabled属性设置为true,以开启此功能:
@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled=true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{
}
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值
@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
为了使用上述4个注解,需要将@EnableGlobalMethodSecurity注解的prePostEnabled属性设置为true。
Spring支持多种不同的RPC模型,包括RMI、Caucho的Hessian和Burlap以及Spring自带的HTTP invoker。
RmiServiceExporter可以把任意Spring管理的bean发布为RMI服务。
Spring的RmiProxyFactoryBean是一个工厂bean,该bean可以为RMI服务创建代理。
REST:Representational State Transfer.
REST与RPC几乎没有任何关系。RPC是面向服务的,并关注于行为和动作;而REST是面向资源的,强调描述应用程序的事务和名词。
Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式:
1. 内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式。
2. 消息转换器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。
如果在控制器类上使用@RestController来代替@Controller的话,Spring将会为该控制器的所有处理方法应用消息转换功能。我们不必为每个方法都添加@ResponseBody了。
Spring提供了以下方式来处理非正常的场景:
1. 使用@ResponseStatus注解可以指定状态码。
2. 控制器方法可以返回ResponseEntity对象,该对象能够包含更多响应相关的元数据。
3. 异常处理器能够应对错误场景,这样处理器方法就能关注于正常的状况。
HttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet("http://graph.facebook.com/" + id);
request.setHeader("Accept", "application/json");
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();
1. 在配置类上添加@EnableCaching注解。
2. 在xml配置文件上添加<cache:annotation-driven />
它们都会创建一个切面并触发Spring缓存注解的切点。根据所使用的注解以及缓存的状态,这个切面会存缓存中获取数据,将数据添加到缓存之中或者从缓存中移除某个值。
还需要声明一个缓存管理器。
缓存管理器是Spring缓存抽象的核心,它能够与多个流行的缓存实现进行集成。
使用Spring的缓存抽象时,最为通用的方式就是在方法上添加@Cacheable和@CacheEvict注解。
@Cacheable
@CachePut
@CacheEvict
@Cacheable首先在缓存中查找条目,如果找到了匹配的条目,那么就不会对方法进行调用了。如果没有找到匹配条目,方法会被调用并且返回值要放到缓存中。而@CachePut并不会在缓存中检查匹配的值,目标方法总是会被调用,并将返回值添加到缓存之中。
@Cacheable和@CachePut有一些属性是共有的,如:
value String[] 要使用的缓存名称。
condition String SpEL表达式,如果得到的值是false的话,不会将缓存应用到方法调用上。
key String SpEL表达式,用来计算自定义的缓存key。
unless String SpEL表达式,如果得到的值是true的话,返回值不会放到缓存之中。
Spring提供了多个用来定义缓存规则的SpEL扩展:
#root.args 传递给缓存方法的参数,形式为数组
#root.caches 该方法执行时所对应的缓存,形式为数组
#root.target 目标对象
#root.targetClass 目标对象的类,是#root.target.class的简写形式
#root.method 缓存方法
#root.methodName 缓存方法的名字,是#root.method.name的简写形式
#result 方法调用的返回值
有时候可能需要使用XML配置缓存,情景如下:
1. 你可能会觉得在自己的源码中添加Spring的注解有点不太舒服;
2. 你需要在没有源码的bean上应用缓存功能。
Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架。Spring Security提供了完整的安全性解决方案,它能够在Web请求级别和方法调用级别处理身份认证和授权。
Spring Security从两个角度来解决安全性问题。它使用Servlet规范中的Filter保护Web请求并限制URL级别的访问。Spring Security还能够使用Spring AOP保护方法调用--借助于对象代理和使用通知,能够确保只有具备适当权限的用户才能访问安全保护的方法。
Spring Security提供了三种不同的安全注解:
1. Spring Security自带的@Secured注解
2. JSR-250的@RolesAllowed注解
3. 表达式驱动的注解,包括@PreAuthorize @PostAuthorize @PreFilter @PostFilter
@Secured和@RolesAllowed方案非常类似,能够基于用户所授予的权限限制对方法的访问。当我们需要在方法上定义更灵活的安全规则时,Spring Securioty提供了@PreAuthorize和@PostAuthorize,而@PreFilter/@PostFilter能够过滤方法返回的以及传入方法的集合。
在Spring中,如果要启用基于注解的方法安全性,关键之处在于要在配置类上使用@EnableGlobalMethodSecurity,如下所示:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled=true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{
}
如果选择使用@RolesAllowed的话,需要将@EnableGlobalMethodSecurity的jsr250Enabled属性设置为true,以开启此功能:
@Configuration
@EnableGlobalMethodSecurity(jsr250Enabled=true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{
}
@PreAuthorize 在方法调用之前,基于表达式的计算结果来限制对方法的访问
@PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PreFilter 允许方法调用,但必须在进入方法之前过滤输入值
@PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
为了使用上述4个注解,需要将@EnableGlobalMethodSecurity注解的prePostEnabled属性设置为true。
Spring支持多种不同的RPC模型,包括RMI、Caucho的Hessian和Burlap以及Spring自带的HTTP invoker。
RmiServiceExporter可以把任意Spring管理的bean发布为RMI服务。
Spring的RmiProxyFactoryBean是一个工厂bean,该bean可以为RMI服务创建代理。
REST:Representational State Transfer.
REST与RPC几乎没有任何关系。RPC是面向服务的,并关注于行为和动作;而REST是面向资源的,强调描述应用程序的事务和名词。
Spring提供了两种方法将资源的Java表述形式转换为发送给客户端的表述形式:
1. 内容协商(Content negotiation):选择一个视图,它能够将模型渲染为呈现给客户端的表述形式。
2. 消息转换器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。
如果在控制器类上使用@RestController来代替@Controller的话,Spring将会为该控制器的所有处理方法应用消息转换功能。我们不必为每个方法都添加@ResponseBody了。
Spring提供了以下方式来处理非正常的场景:
1. 使用@ResponseStatus注解可以指定状态码。
2. 控制器方法可以返回ResponseEntity对象,该对象能够包含更多响应相关的元数据。
3. 异常处理器能够应对错误场景,这样处理器方法就能关注于正常的状况。
HttpClient client = HttpClients.createDefault();
HttpGet request = new HttpGet("http://graph.facebook.com/" + id);
request.setHeader("Accept", "application/json");
HttpResponse response = client.execute(request);
HttpEntity entity = response.getEntity();