天天看点

一种缓存注入的写法

1、我们需要一个缓存接口

public interface CacheService {

    Object get(String key);

    void set(String key, Object value);

    void delete(String key);

    void setCacheService(CacheService cacheService);

}
           

2、实现这个接口

public class CacheServuceImpl implements CacheService {

    /**
     * 使用匿名类做为缓存接口的实现
     * 这种写法将缓存的实现封装了起来
     */
    private CacheService cacheService = new CacheService() {

        // 默认使用HashMap做为缓存
        private Map<Object, Object> cacheMap = new HashMap<>();

        @Override
        public Object get(String key) {
            return cacheMap.get(key);
        }

        @Override
        public void set(String key, Object value) {
            cacheMap.put(key, value);
        }

        @Override
        public void delete(String key) {
            cacheMap.remove(key);
        }

        @Override
        public void setCacheService(CacheService cacheService) {
            throw new UnsupportedOperationException();
        }

    };

    @Override
    public void setCacheService(CacheService cacheService) {
        this.cacheService = cacheService;
    }

    @Override
    public Object get(String key) {
        Object value = cacheService.get(key);
        System.out.println("获取缓存" + value);
        return value;
    }

    @Override
    public void set(String key, Object value) {
        System.out.println("设置缓存" + value);
        cacheService.set(key, value);
    }

    @Override
    public void delete(String key) {
        System.out.println("删除缓存" + key);
        cacheService.delete(key);
    }
}
           

3、打印一下

public class Client {

    public static void main(String[] args) {
        CacheService service = new CacheServuceImpl();
        service.set("a", "窗前明月光");
        service.get("a");
        service.delete("a");
        service.get("a");
        
        // 通过set方法可以将我们自动以的缓存实现注入进去
        service.setCacheService(new CacheService() {
            @Override
            public Object get(String key) {
                return null;
            }

            @Override
            public void set(String key, Object value) { }

            @Override
            public void delete(String key) { }

            @Override
            public void setCacheService(CacheService cacheService) { }
        });
    }
}
           

我们使用匿名类做为默认实现,使用set方法注入自定义实现,好处是脱离了容器,更加灵活。

继续阅读