目錄java
Spring4.1新特性——綜述git
Spring4.1新特性——Spring核心部分及其餘github
Spring4.1新特性——Spring緩存框架加強spring
Spring4.1新特性——異步調用和事件機制的異常處理數據庫
Spring4.1新特性——數據庫集成測試腳本初始化api
Spring4.1新特性——Spring MVC加強緩存
Spring4.1新特性——頁面自動化測試框架Spring MVC Test HtmlUnit簡介框架
Spring4.1新特性——靜態資源處理加強異步
Spring 4.1提供了對jcache的支持,並對cache抽象部分進行了一些簡單的加強。在集成jcache時是很是費勁的,版本之間各類不兼容,不建議用於正式環境,在正式環境中可使用如Guava Cache或Ehcache。ide
jcache依賴:
- <dependency>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>ehcache-jcache</artifactId>
- <version>${ehcache-jcache.version}</version>
- </dependency>
- <dependency>
- <groupId>javax.cache</groupId>
- <artifactId>cache-api</artifactId>
- <version>${javax.cache.version}</version>
- </dependency>
- <dependency>
- <groupId>org.jsr107.ri</groupId>
- <artifactId>cache-ri-impl</artifactId>
- <version>${cache-ri-impl.version}</version>
- </dependency>
<javax.cache.version>1.0.0</javax.cache.version>、<cache-ri-impl.version>1.0.0</cache-ri-impl.version>、<ehcache-jcache.version>1.2</ehcache-jcache.version>,具體請參考源碼。
一、Jcache集成
建立Cache:
- javax.cache.CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
- MutableConfiguration<Object, Object> mutableConfiguration = new MutableConfiguration<Object, Object>();
- mutableConfiguration.setStoreByValue(false);
- cacheManager.createCache("user", mutableConfiguration);
- cacheManager.createCache("user2", mutableConfiguration);
- cacheManager.createCache("user3", mutableConfiguration);
-
- JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
- return jCacheCacheManager;
Java Config方式提供了CachingConfigurer用於提供配置回調:
- @Configuration
- @ComponentScan(basePackages = "com.sishuok.spring.service")
- @EnableCaching(proxyTargetClass = true)
- public class AppConfig implements CachingConfigurer {
- @Bean
- @Override
- public CacheManager cacheManager() {
- javax.cache.CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
- MutableConfiguration<Object, Object> mutableConfiguration = new MutableConfiguration<Object, Object>();
- mutableConfiguration.setStoreByValue(false);
- cacheManager.createCache("user", mutableConfiguration);
- cacheManager.createCache("user2", mutableConfiguration);
- cacheManager.createCache("user3", mutableConfiguration);
-
- JCacheCacheManager jCacheCacheManager = new JCacheCacheManager(cacheManager);
- return jCacheCacheManager;
- }
-
- @Bean
- @Override
- public CacheResolver cacheResolver() {
- return new MyCacheResolver();
- }
-
- @Bean
- @Override
- public KeyGenerator keyGenerator() {
- return new SimpleKeyGenerator();
- }
-
- @Override
- public CacheErrorHandler errorHandler() {
- return new CacheErrorHandler() {
- @Override
- public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
- System.out.println("cache get error");
- }
-
- @Override
- public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
- System.out.println("cache put error");
- }
-
- @Override
- public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
- System.out.println("cache evict error");
- }
-
- @Override
- public void handleCacheClearError(RuntimeException exception, Cache cache) {
- System.out.println("cache clear error");
- }
- };
- }
- }
二、@CacheConfig指定全局Cache配置
Spring 4.1以前須要每一個方法上都指定:
- @Service
- public class UserService {
-
- Set<User> users = new HashSet<User>();
-
- @CachePut(value = "user", key = "#user.id")
- public User save(User user) {
- users.add(user);
- return user;
- }
-
- @CachePut(value = "user", key = "#user.id")
- public User update(User user) {
- users.remove(user);
- users.add(user);
- return user;
- }
-
- @CacheEvict(value = "user", key = "#user.id")
- public User delete(User user) {
- users.remove(user);
- return user;
- }
-
- @CacheEvict(value = "user", allEntries = true)
- public void deleteAll() {
- users.clear();
- }
-
- @Cacheable(value = "user", key = "#id")
- public User findById(final Long id) {
- System.out.println("cache miss, invoke find by id, id:" + id);
- for (User user : users) {
- if (user.getId().equals(id)) {
- return user;
- }
- }
- return null;
- }
-
- }
Spring 4.1時能夠直接在類級別使用@CacheConfig指定:
- @Service
- @CacheConfig(cacheNames = {"user", "user2"})
- public class UserService {
-
- Set<User> users = new HashSet<User>();
-
- @CachePut(key = "#user.id")
- public User save(User user) {
- users.add(user);
- return user;
- }
-
- @CachePut(key = "#user.id")
- public User update(User user) {
- users.remove(user);
- users.add(user);
- return user;
- }
-
- @CacheEvict(key = "#user.id")
- public User delete(User user) {
- users.remove(user);
- return user;
- }
-
- @CacheEvict(allEntries = true)
- public void deleteAll() {
- users.clear();
- }
-
- @Cacheable(key = "#id")
- public User findById(final Long id) {
- System.out.println("cache miss, invoke find by id, id:" + id);
- for (User user : users) {
- if (user.getId().equals(id)) {
- return user;
- }
- }
- return null;
- }
- }
三、CacheResolver
其名字已經暗示了其是Cache解析器,用於根據實際狀況來動態解析使用哪一個Cache,如:
- public class MyCacheResolver implements CacheResolver {
-
- @Autowired
- private CacheManager cacheManager;
-
- @Override
- public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
- List<Cache> caches = new ArrayList<Cache>();
- for(String cacheName : context.getOperation().getCacheNames()) {
- caches.add(cacheManager.getCache(cacheName));
- }
- if(context.getTarget() instanceof UserService2) {
- caches.add(cacheManager.getCache("user2"));
- caches.add(cacheManager.getCache("user3"));
- }
- return caches;
- }
- }
context中存放了當前cache的操做類型、目標對象、目標方法、參數信息,這樣咱們能夠根據這些信息來決定使用那些cache; context.getOperation().getCacheNames()獲得當前目標對象/目標方法上配置的cache Name;而後咱們能夠在此基礎上添加額外的cache。
此處須要注意的是即便配置了CacheResolver,也必須在@CacheConfig或方法上的如@CachePut上指定至少一個Cache Name。
四、CacheErrorHandler
用於捕獲從Cache中進行CRUD時的異常的回調處理器。
相關資料
Spring Cache抽象詳解
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-cache