caching work

This commit is contained in:
eugenp 2016-05-03 13:27:12 +03:00
parent 378d0c084b
commit f83d3dcccc
6 changed files with 159 additions and 41 deletions

View File

@ -2,23 +2,19 @@ package org.baeldung.caching.config;
import java.util.Arrays; import java.util.Arrays;
import org.baeldung.caching.example.CustomerDataService;
import org.springframework.cache.CacheManager; import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache; import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.support.SimpleCacheManager; import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
@EnableCaching @EnableCaching
@ComponentScan("org.baeldung.caching.example")
public class CachingConfig { public class CachingConfig {
@Bean
public CustomerDataService customerDataService() {
return new CustomerDataService();
}
@Bean @Bean
public CacheManager cacheManager() { public CacheManager cacheManager() {
final SimpleCacheManager cacheManager = new SimpleCacheManager(); final SimpleCacheManager cacheManager = new SimpleCacheManager();

View File

@ -0,0 +1,76 @@
package org.baeldung.caching.example;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
public abstract class AbstractService {
// this method configuration is equivalent to xml configuration
@Cacheable(value = "addresses", key = "#customer.name")
public String getAddress(final Customer customer) {
return customer.getAddress();
}
/**
* The method returns the customer's address,
only it doesn't find it the cache- addresses and directory.
*
* @param customer the customer
* @return the address
*/
@Cacheable({ "addresses", "directory" })
public String getAddress1(final Customer customer) {
return customer.getAddress();
}
/**
* The method returns the customer's address,
but refreshes all the entries in the cache to load new ones.
*
* @param customer the customer
* @return the address
*/
@CacheEvict(value = "addresses", allEntries = true)
public String getAddress2(final Customer customer) {
return customer.getAddress();
}
/**
* The method returns the customer's address,
but not before selectively evicting the cache as per specified paramters.
*
* @param customer the customer
* @return the address
*/
@Caching(evict = { @CacheEvict("addresses"), @CacheEvict(value = "directory", key = "#customer.name") })
public String getAddress3(final Customer customer) {
return customer.getAddress();
}
/**
* The method uses the class level cache to look up for entries.
*
* @param customer the customer
* @return the address
*/
@Cacheable
// parameter not required as we have declared it using @CacheConfig
public String getAddress4(final Customer customer) {
return customer.getAddress();
}
/**
* The method selectively caches the results that meet the predefined criteria.
*
* @param customer the customer
* @return the address
*/
@CachePut(value = "addresses", condition = "#customer.name=='Tom'")
// @CachePut(value = "addresses", unless = "#result.length>64")
public String getAddress5(final Customer customer) {
return customer.getAddress();
}
}

View File

@ -1,7 +1,5 @@
package org.baeldung.caching.example; package org.baeldung.caching.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.CachePut;
@ -13,9 +11,6 @@ import org.springframework.stereotype.Component;
@CacheConfig(cacheNames = { "addresses" }) @CacheConfig(cacheNames = { "addresses" })
public class CustomerDataService { public class CustomerDataService {
@Autowired
CacheManager cacheManager;
// this method configuration is equivalent to xml configuration // this method configuration is equivalent to xml configuration
@Cacheable(value = "addresses", key = "#customer.name") @Cacheable(value = "addresses", key = "#customer.name")
public String getAddress(final Customer customer) { public String getAddress(final Customer customer) {

View File

@ -0,0 +1,10 @@
package org.baeldung.caching.example;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.stereotype.Component;
@Component
@CacheConfig(cacheNames = { "addresses" })
public class CustomerServiceWithParent extends AbstractService {
//
}

View File

@ -1,30 +0,0 @@
package org.baeldung.caching.test;
import org.baeldung.caching.config.CachingConfig;
import org.baeldung.caching.example.Customer;
import org.baeldung.caching.example.CustomerDataService;
import org.junit.Test;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
@Component
public class SpringCachingBehaviorTest {
@Test
public void testCaching() {
@SuppressWarnings("resource")
final
// final ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(CachingConfig.class);
context.refresh();
final CustomerDataService service = context.getBean(CustomerDataService.class);
final Customer cust = new Customer("Tom", "67-2, Downing Street, NY");
service.getAddress(cust);
service.getAddress(cust);
// fail("Unable to instantiate the CustomerDataService");
}
}

View File

@ -0,0 +1,71 @@
package org.baeldung.caching.test;
import org.baeldung.caching.config.CachingConfig;
import org.baeldung.caching.example.Customer;
import org.baeldung.caching.example.CustomerDataService;
import org.baeldung.caching.example.CustomerServiceWithParent;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { CachingConfig.class }, loader = AnnotationConfigContextLoader.class)
public class SpringCachingIntegrationTest {
@Autowired
private CustomerDataService service;
@Autowired
private CustomerServiceWithParent serviceWithParent;
//
@Test
public void whenGettingAddress_thenCorrect() {
final Customer cust = new Customer("Tom", "67-2, Downing Street, NY");
service.getAddress(cust);
service.getAddress(cust);
service.getAddress1(cust);
service.getAddress1(cust);
service.getAddress2(cust);
service.getAddress2(cust);
service.getAddress3(cust);
service.getAddress3(cust);
service.getAddress4(cust);
service.getAddress4(cust);
service.getAddress5(cust);
service.getAddress5(cust);
}
@Test
public void givenUsingServiceWithParent_whenGettingAddress_thenCorrect() {
final Customer cust = new Customer("Tom", "67-2, Downing Street, NY");
serviceWithParent.getAddress(cust);
serviceWithParent.getAddress(cust);
serviceWithParent.getAddress1(cust);
serviceWithParent.getAddress1(cust);
serviceWithParent.getAddress2(cust);
serviceWithParent.getAddress2(cust);
serviceWithParent.getAddress3(cust);
serviceWithParent.getAddress3(cust);
// serviceWithParent.getAddress4(cust);
// serviceWithParent.getAddress4(cust);
serviceWithParent.getAddress5(cust);
serviceWithParent.getAddress5(cust);
}
}