Configurar la declaración de almacenamiento en caché para Spring Cache
Después de configurar su aplicación Spring y habilitar el almacenamiento en caché, el siguiente paso es identificar los métodos que deben almacenarse en caché y sus respectivas políticas.
Puede vincular los comportamientos de almacenamiento en caché a los métodos en Spring Cache usando:
- Almacenamiento en caché de anotaciones
- Almacenamiento en caché declarativo basado en XML
Configurar usando anotaciones de Spring Caches
Para las declaraciones de almacenamiento en caché, la abstracción proporciona anotaciones de Java que permiten que los métodos activen el llenado o el desalojo de la caché de Spring.
Ejemplo
Consideremos un servicio web con dos clases que explican cómo se realiza el almacenamiento en caché en Spring cache usando el @caché anotación.
// BookController.java
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
BookService booksService;
@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd-yyyy");
sdf.setLenient(true);
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
@RequestMapping(value="/bookstore", method = RequestMethod.GET)
public ModelAndView homePage(Model model) {
model.addAttribute("availableBooks", booksService.listAll());
return new ModelAndView("bookstore");
}
@RequestMapping(value = "/bookstore/new", method = RequestMethod.GET)
public String add(ModelMap model) {
model.addAttribute("book", new Book());
return "newBook";
}
@RequestMapping(value = "/bookstore/save", method = RequestMethod.POST)
public String saveBook(@ModelAttribute("book") Book book, BindingResult result) {
if (result.hasErrors()) {
return "newBook";
}
booksService.save(book);
return "redirect:/bookstore";
}
@RequestMapping(value = "/bookstore/edit", method = RequestMethod.GET)
public String showEditBookPage(@RequestParam int id, ModelMap model) {
Book book = booksService.get(id);
model.put("book", book);
return "newBook";
}
@RequestMapping(value = "/bookstore/edit", method = RequestMethod.POST)
public String updateBook(@ModelAttribute("book") Book book, BindingResult result) {
if (result.hasErrors()) {
return "newBook";
}
booksService.update(book);
return "redirect:/bookstore";
}
@RequestMapping(value = "/bookstore/delete")
public String deleteBook(@RequestParam int id) {
booksService.delete(id);
return "redirect:/bookstore";
}
@RequestMapping(value="/bookstore", method = RequestMethod.POST)
public ModelAndView findBook(ModelMap model, @RequestParam long isbn) {
Book book = booksService.findBookByIsbn(isbn);
if (book == null) {
return returnError(model, isbn);
}
model.put("book", book);
return new ModelAndView("bookdetails");
}
private ModelAndView returnError(ModelMap model, long isbn) {
String errorMessage = "The book with ISBN: " + isbn + " is not available.";
model.put("errorMessage", errorMessage);
return new ModelAndView(new RedirectView("bookstore"));
}
}
// BookService.java
@Service
class BookService {
@Autowired
private BookRepository repo;
public List<Book> listAll() {
return repo.findAll();
}
@CachePut(value = "books", key = "#book.getISBN()")
public void save(Book book) {
repo.save(book);
}
@CachePut(value = "books", key = "#book.getISBN()")
public void update(Book book) { repo.save(book); }
@Cacheable(value = "books", key = "#id")
public Book get(int id) {
return repo.findById(id);
}
@Cacheable(value = "books", key = "#isbn")
public Book findBookByIsbn(long isbn) {
return repo.findBookByIsbn(isbn);
}
@CacheEvict(value = "books", allEntries = true)
public void delete(int id) {
repo.deleteById(id);
}
}
Para obtener una comprensión detallada y aprender más sobre otras anotaciones de almacenamiento en caché o la creación del generador de claves personalizadas, consulte la Documentación de primavera.
Configurar mediante el almacenamiento en caché basado en XML declarativo
Si las anotaciones no son una opción, es decir, si tiene acceso limitado a las fuentes o no tiene código externo, puede usar XML para el almacenamiento en caché declarativo. Aquí puede especificar el método de destino y las directivas de almacenamiento en caché de forma externa.
En la configuración siguiente, el libroServicio se puede almacenar en caché. La semántica del almacenamiento en caché está encapsulada en el cache:advice
definición, que indica el método encontrarLibroPorIsbn para poner datos en el caché mientras se trabaja contra el caché de demostración.
Note
Cuando se utiliza el class
etiqueta, asegúrese de utilizar el nombre completo de su clase.
<!-- the service we want to make cacheable -->
<bean id="bookService" class="com.spring.service.BookService"/>
<!-- cache definitions -->
<cache:advice id="booksCacheAdvice" cache-manager="cacheManager">
<cache:caching cache="demoCache">
<cache:cacheable method="findBookByIsbn" key="#isbn"/>
</cache:caching>
</cache:advice>
<app:config>
<app:advisor advice-ref="booksCacheAdvice" pointcut="execution(* com.spring.service.BookService.*(..))"/>
</app:config>
Además, para utilizar el generador de claves personalizado para la generación de claves de caché a través del almacenamiento en caché basado en XML, los beans creados para el generador de claves deben definirse como se muestra a continuación en CustomerKeyGenerator
como una clase.
<bean id="customerKeyGenerator" class="cachekeygenerator.CustomerKeyGenerator">
Aquí el customerKeyGenerator
genera una clave de caché cada vez que se agrega un cliente a la Caché de clientes. Para utilizar este generador, debe especificar el keygenerator
frijol en tu cache:advice
etiqueta.
<cache:advice id="customerCacheAdvice" key-generator="customerKeyGenerator">
<cache:caching cache="customersCache">
<cache:cacheable method="findCustomerByID"/>
</cache:caching>
</cache:advice>
Después de modificar todas estas configuraciones, su aplicación ahora está lista para usar NCache como proveedor de almacenamiento en caché de Spring.
Vea también
Configurar la aplicación para el proveedor genérico de almacenamiento en caché de Spring
NCache como caché de datos Spring