Spring 不缓存的 EhCache
EhCache with Spring not caching
我有一个使用 Spring 框架创建的项目。现在考虑为应用程序缓存一些数据。我使用 EhCache 库进行缓存。 link 说明如何在 spring 上配置它:Spring Caching and Ehcache example
它有效,但是当我要更改这行代码时
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MovieDao obj = (MovieDao) context.getBean("movieDao");
到
MovieDao obj = new MovieDaoImp();
正在正确停止工作。它每次都调用方法。但我想用第二个。有什么区别?我怎样才能让第二个工作?
添加了一些代码
我的 spring MVC 项目结构如下:
控制器:
@Controller
public class MainController {
@Autowired
private BackEndService backEnd;
@RequestMapping(value = "/home", method = RequestMethod.GET)
public ModelAndView viewDefault(Model model) throws Exception {
model.addAttribute("categories", getCategoriesForGuest())
return new ModelAndView(JspView.Home, model.asMap());
}
//@Cacheable(value = "categoriesCache")
//first i want to make cachable this method. Not worked
private List<Category> getCategoriesForGuest() {
//i am going to cache method(guestListPaymentCategories()), but not worked neither.
List<Category> categoriesResult = backEnd
.guestListPaymentCategories()
.getCategories()
.getCategory();
return categoriesResult;
}
}
BackEndService.java
@Service
public class BackEndService {
protected WcfBackendService_Service service;
protected WcfBackendService port;
public BackEndService () {
service = new WcfBackendService_Service();
port = service.getSOAP();
}
@Cacheable(value = "categoriesCache")
public ListCategoriesResult guestListPaymentCategories() {
ListCategoriesResult result = null;
try {
result = port.guestListPaymentCategories(request);
if (result.getResultCodes() == ResultCodes.OK) {
return result;
} else {
throw new Exception(result.getDescription());
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return result;
}
}
如果使用 Spring > 4.1 的任何工作样本将被淘汰
当您使用 new ...()
创建对象实例时,它不再是 Spring 托管 bean - 因此您失去了 Spring 添加的所有功能,即方面(在您的情况下 - @Cacheable
)、交易等
基本上,Spring 所做的是为您的对象创建一个代理,该代理处理对接口方法的所有调用,并根据存在的注释和方面添加额外的逻辑。当您手动创建对象的实例时,不会创建代理,所有调用都会直接进入对象的方法。
我有一个使用 Spring 框架创建的项目。现在考虑为应用程序缓存一些数据。我使用 EhCache 库进行缓存。 link 说明如何在 spring 上配置它:Spring Caching and Ehcache example 它有效,但是当我要更改这行代码时
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MovieDao obj = (MovieDao) context.getBean("movieDao");
到
MovieDao obj = new MovieDaoImp();
正在正确停止工作。它每次都调用方法。但我想用第二个。有什么区别?我怎样才能让第二个工作?
添加了一些代码 我的 spring MVC 项目结构如下:
控制器:
@Controller
public class MainController {
@Autowired
private BackEndService backEnd;
@RequestMapping(value = "/home", method = RequestMethod.GET)
public ModelAndView viewDefault(Model model) throws Exception {
model.addAttribute("categories", getCategoriesForGuest())
return new ModelAndView(JspView.Home, model.asMap());
}
//@Cacheable(value = "categoriesCache")
//first i want to make cachable this method. Not worked
private List<Category> getCategoriesForGuest() {
//i am going to cache method(guestListPaymentCategories()), but not worked neither.
List<Category> categoriesResult = backEnd
.guestListPaymentCategories()
.getCategories()
.getCategory();
return categoriesResult;
}
}
BackEndService.java
@Service
public class BackEndService {
protected WcfBackendService_Service service;
protected WcfBackendService port;
public BackEndService () {
service = new WcfBackendService_Service();
port = service.getSOAP();
}
@Cacheable(value = "categoriesCache")
public ListCategoriesResult guestListPaymentCategories() {
ListCategoriesResult result = null;
try {
result = port.guestListPaymentCategories(request);
if (result.getResultCodes() == ResultCodes.OK) {
return result;
} else {
throw new Exception(result.getDescription());
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return result;
}
}
如果使用 Spring > 4.1 的任何工作样本将被淘汰
当您使用 new ...()
创建对象实例时,它不再是 Spring 托管 bean - 因此您失去了 Spring 添加的所有功能,即方面(在您的情况下 - @Cacheable
)、交易等
基本上,Spring 所做的是为您的对象创建一个代理,该代理处理对接口方法的所有调用,并根据存在的注释和方面添加额外的逻辑。当您手动创建对象的实例时,不会创建代理,所有调用都会直接进入对象的方法。