Spring不能静态引用非静态方法吗?

时间:2018-09-22 14:53:33

标签: java spring hibernate spring-mvc static

这是我的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;
}

我收到一个错误,指出静态引用不能成为非静态方法。

请查看第一个代码段。您会明白问题所在

2 个答案:

答案 0 :(得分:0)

是的,绝对。

静态对象和非静态对象的工作方式不同。 对于非静态方法,必须在使用之前实例化。 因此,在静态方法中使用非静态方法无效。

还有一件事,将在构造函数之前调用静态块。因此,请仔细检查您的业务逻辑。我不太明白为什么要在静态块中覆盖其他功能。

答案 1 :(得分:0)

尝试最小化使用静态字段和方法,Spring应该让您避免在大多数时间使用静态。将其用于常量和没有状态的静态方法。

Spring不会注入静态字段。 Spring无法通过控制bean创建的方式来控制类加载,因此无法确保依赖关系已连接起来。

这也是尝试通过缓存这些类别来进行优化,但是如果类别可以在应用程序的整个生命周期内发生变化,这将不起作用。 (您不必只是为了刷新类别而不必重新启动应用程序。)Spring具有缓存API,您可以在其中无需编写代码就能获得更好的缓存。

为使用实例方法的类别创建普通的DAO或JpaRepository,并使用缓存提供程序(例如EHCache)来处理缓存。静态方法是我们在Spring之前的糟糕日子里使用的方法,请不要回溯。