Spring Cache のキャッシュ宣言を構成する
Springアプリケーションを構成し、キャッシュを有効にした後、次のステップは、キャッシュする必要のあるメソッドとそれぞれのポリシーを特定することです。
以下を使用して、キャッシュ動作を Spring Cache のメソッドにバインドできます。
- キャッシングアノテーション
- 宣言型 XML ベースのキャッシュ
Spring キャッシュアノテーションを使用した構成
キャッシュ宣言の場合、抽象化は、メソッドが Spring キャッシュの作成または削除をトリガーできるようにする Java アノテーションを提供します。
例
Spring キャッシュでキャッシュがどのように行われるかを説明する 2 つのクラスを持つ Web サービスを考えてみましょう。 @キャッシュ可能 注釈。
// 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);
}
}
他のキャッシュ アノテーションやカスタム キー ジェネレーターの作成について詳しく理解するには、「 Springドキュメント.
宣言型 XML ベースのキャッシュを使用した構成
注釈がオプションではない場合、つまり、ソースへのアクセスが制限されている場合、または外部コードがない場合は、宣言型キャッシュに XML を使用できます。ここでは、ターゲット メソッドとキャッシュ ディレクティブを外部から指定できます。
以下の構成では、 本サービス キャッシュ可能になります。キャッシュのセマンティクスは、 cache:advice
メソッドを指示する定義 Isbn で本を見つける に対抗しながらデータをキャッシュに入れるため デモキャッシュ.
Note
使用している場合 class
タグにはクラスの完全修飾名を使用してください。
<!-- 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>
また、XML ベースのキャッシュによるキャッシュ キーの生成にカスタム キー ジェネレーターを使用するには、キー ジェネレーター用に作成された Bean を以下に示すように定義する必要があります。 CustomerKeyGenerator
クラスとして。
<bean id="customerKeyGenerator" class="cachekeygenerator.CustomerKeyGenerator">
ここで、 customerKeyGenerator
顧客が追加されるたびにキャッシュ キーを生成します。 CustomersCache。このジェネレーターを使用するには、 keygenerator
あなたの豆 cache:advice
タグ。
<cache:advice id="customerCacheAdvice" key-generator="customerKeyGenerator">
<cache:caching cache="customersCache">
<cache:cacheable method="findCustomerByID"/>
</cache:caching>
</cache:advice>
これらすべての構成を変更すると、アプリケーションを使用できるようになります。 NCache Spring キャッシュプロバイダーとして。
も参照してください
Generic SpringCachingProviderのアプリケーションを構成する
NCache Springデータキャッシュとして