这是我的PageController代码。
@RequestMapping(value = { "/show/category/{id}/products" })
public ModelAndView showCategoryProducts(@PathVariable("id") int id) {
// Category DAO //Getting Error Here
Category category = null;//Please Explain this line also.
category = CategoryDAO.get(id);// Getting Error in this line
ModelAndView mv = new ModelAndView("page");
mv.addObject("title", "All Products");
// Passing list of categories
mv.addObject("categories", categoryDAO.list());
mv.addObject("userClickCategoryProducts", true);
return mv;
}
CategoreDAO类中的代码
public interface CategoryDAO {
List<Category> list();
Category get(int id);
}
另一个实现CategoryDAO类的类
Repository("CategoryDAO")
public class CategoryDAOImpl implements CategoryDAO {
private static List<Category> categories = new ArrayList<>();
static {@Override
public Category get(int id) {
for(Category category:categories) {
if(category.getId()==id)
return category;
}
return null;
}
我收到一个错误,指出静态引用不能成为非静态方法。
请查看第一个代码段。您会明白问题所在
答案 0 :(得分:0)
是的,绝对。
静态对象和非静态对象的工作方式不同。 对于非静态方法,必须在使用之前实例化。 因此,在静态方法中使用非静态方法无效。
还有一件事,将在构造函数之前调用静态块。因此,请仔细检查您的业务逻辑。我不太明白为什么要在静态块中覆盖其他功能。
答案 1 :(得分:0)
尝试最小化使用静态字段和方法,Spring应该让您避免在大多数时间使用静态。将其用于常量和没有状态的静态方法。
Spring不会注入静态字段。 Spring无法通过控制bean创建的方式来控制类加载,因此无法确保依赖关系已连接起来。
这也是尝试通过缓存这些类别来进行优化,但是如果类别可以在应用程序的整个生命周期内发生变化,这将不起作用。 (您不必只是为了刷新类别而不必重新启动应用程序。)Spring具有缓存API,您可以在其中无需编写代码就能获得更好的缓存。
为使用实例方法的类别创建普通的DAO或JpaRepository,并使用缓存提供程序(例如EHCache)来处理缓存。静态方法是我们在Spring之前的糟糕日子里使用的方法,请不要回溯。