2017-08-03 47 views
0

我有一個頻繁訪問但笨重值 - 值a,其通過一種方法得到的 - 其餘了methodA控制器 - ControllerA。所以我使用@Cacheable註釋緩存了這個值,如下所示。如何訪問在其他控制器中使用spring @cacheable緩存的值?

@CacheConfig(cacheNames={"abc_cache"}) 
    public class ControllerA 
{ 

    @Cacheable 
    @RequestMapping(value = "/value/" , method=RequestMethod.GET) 
    public ResponseEntity<Value> fetchValue() 
    { 
     // some logic 
     return new ResponseEntity<Value>(value, HttpStatus.OK); 
    } 
} 

我想訪問另一個方法的另一個方法 - methodB - controllerB。 如何訪問此值?

回答

2

你可以有一些其他的類/ bean來提供該值。然後你可以在你想要的所有控制器中注入這個bean。

事情是這樣的:

@Component 
public class MyValueService { 
    @Cacheable 
    public Value getValue() { 
     return ...; 
    } 
} 

,然後在控制器

public class ControllerA 
{ 
    @Autowired 
    private MyValueService valServ; 

    @RequestMapping(value = "/value/" , method=RequestMethod.GET) 
    public ResponseEntity<Value> fetchValue() 
    { 
     return new ResponseEntity<Value>(valServ.getValue(), HttpStatus.OK); 
    } 
} 

你知道的控制器 - >服務 - >存儲庫模式?

基本上:

控制器 s爲網絡層。他們處理http請求。他們使用服務。

服務 s爲負責應用程序的業務邏輯。他們使用存儲庫。

Repositori ES負責數據訪問 - 數據庫訪問,讀取文件系統/寫等

您應構建應用程序的方式。

一般來說,我會存儲庫層上使用緩存。通常情況下,瓶頸是I/O操作(讀取/寫入文件系統,數據庫調用,通過網絡調用外部服務),如果可能的話,這些都是您想要緩存的內容。

+0

感謝葉夫根..我已經在我的項目這個架構。只是我沒有意識到在存儲庫級別緩存。在這個例子中,你已經表明它在服務層完成,但是從你的評論,我想我應該在DAO層 – shubh

+0

做是的,我的例子只是爲了說明技術。 –

2

我想你應該只是封裝你的邏輯緩存到另一個類的方法,然後就從兩個控制器調用它。

所以

public class ControllerA 
{ 

    @Resource 
    private Service service; 

    @RequestMapping(value = "/value/" , method=RequestMethod.GET) 
    public ResponseEntity<Value> fetchValue() 
    { 
     // some logic 
     Object v = service.cachedMethod(); 
     return new ResponseEntity<Object>(v, HttpStatus.OK); 
    } 
} 

@Component 
public class Service { 

    @Cacheable 
    public Object cachedMethod() {... } 

} 
相關問題