Spring Cacheable vs CachePut?

后端 未结 3 1196
你的背包
你的背包 2020-12-15 04:21
@CachePut or @Cacheable(value = \"CustomerCache\", key = \"#id\")
public Customer updateCustomer(Customer customer) {
   sysout(\"i am inside updateCustomer\");
             


        
3条回答
  •  星月不相逢
    2020-12-15 05:17

    Yes.

    I even made a test to be sure:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = CacheableTest.CacheConfigurations.class)
    public class CacheableTest {
    
        public static class Customer {
    
            final private String id;
            final private String name;
    
            public Customer(String id, String name) {
                this.id = id;
                this.name = name;
            }
    
            public String getId() {
                return id;
            }
    
            public String getName() {
                return name;
            }
    
        }
    
        final public static AtomicInteger cacheableCalled = new AtomicInteger(0);
        final public static AtomicInteger cachePutCalled = new AtomicInteger(0);
    
        public static class CustomerCachedService {
    
    
            @Cacheable("CustomerCache")
            public Customer cacheable(String v) {
                cacheableCalled.incrementAndGet();
                return new Customer(v, "Cacheable " + v);
            }
    
            @CachePut("CustomerCache")
            public Customer cachePut(String b) {
                cachePutCalled.incrementAndGet();
                return new Customer(b, "Cache put " + b);
            }
    
        }
    
        @Configuration
        @EnableCaching()
        public static class CacheConfigurations {
    
            @Bean
            public CustomerCachedService customerCachedService() {
                return new CustomerCachedService();
            }
    
            @Bean
            public CacheManager cacheManager() {
                return new GuavaCacheManager("CustomerCache");
            }
    
        }
    
        @Autowired
        public CustomerCachedService cachedService;
    
        @Test
        public void testCacheable() {
            for(int i = 0; i < 1000; i++) {
                cachedService.cacheable("A");
            }
            Assert.assertEquals(cacheableCalled.get(), 1);
        }
    
        @Test
        public void testCachePut() {
            for(int i = 0; i < 1000; i++) {
                cachedService.cachePut("B");
            }
            Assert.assertEquals(cachePutCalled.get(), 1000);
        }
    
    }
    

提交回复
热议问题