从 Spring MVC 控制器访问服务层

Posted

技术标签:

【中文标题】从 Spring MVC 控制器访问服务层【英文标题】:Access service layer from Spring MVC controllers 【发布时间】:2012-11-08 06:03:55 【问题描述】:

在 Spring MVC 中从 Controller 访问服务层的最佳方法是什么?我正在为 SpringMVC 使用注释。

之前我每次都通过在控制器的每个方法中调用 ClassPathXMLApplicationContext(spring-bean-name.xml) 从 bean factory 获取 bean。

从问题的解决方案Accessing Service Layer from custom Controller in Spring MVC 我知道服务 bean 必须是自动装配的。

但是,假设一个控制器访问多个服务,我们是否必须注入多个 bean?但这不是一个好的做法,因为我们只能在控制器中的 1-2 种方法中使用特定服务,并且将其作为类变量而不是函数变量是不好的。

【问题讨论】:

【参考方案1】:

您是对的,您需要自动装配您打算使用的服务。不用担心类变量与本地(函数)变量,这就是 DI 模式的实现方式。

在最严格的 OO 设计意义上,您有一点是不应该在类级别声明变量,除非它们涉及描述对象的状态。然而,DI(依赖注入)是一种非常成熟的模式,无论有多少方法实际使用该服务,开发人员都不会反对将服务 bean 作为自动装配的类成员。

顺便说一句,在每种方法中都使用new ClassPathXMLApplicationContext("spring-bean-name.xml") 绝对是 100% 的错误方法。这涉及到创建一个新的 bean-factory 和 bean-context每次执行该方法,这是一个很大的开销并且完全没有必要。 bean-factory 应该创建一次(如果您在 servlet 引擎环境中,请使用 DispatcherServlet 或 ContextLoaderListener)。

【讨论】:

谢谢。您能否只提供一个示例代码或演示最后一部分的链接:“bean-factory 应该创建一次(如果您在 servlet-engine 环境中,使用 DispatcherServlet 或 ContextLoaderListener)。”当我使用多个控制器并构建一个非常大的应用程序时,我应该如何做到这一点。 @AkhilKNambiar dzone.com/tutorials/java/spring/… 你看过official documentation吗?尤其是第 16 章(以及某种程度上的 18.2)对你来说应该很有趣。不过,我建议您学习所有内容,以更好地了解 Spring 和 DI 的工作原理。【参考方案2】:

你可以有一个实例化bean工厂的静态类,然后使用这个静态类的自定义静态getBean方法

static class SpringConfig()

    private static ApplicationContext ctx = null;
    static
    
        ctx=new ClassPathXmlApplicationContext("context.xml");
    

    public static Object getBean(String beanName)
    
        return ctx.getBean(beanName);
    

【讨论】:

【参考方案3】:

这就是为什么你必须尝试将所有使用相同依赖项的方法保持在一起,这是低耦合的。不好的做法是不将您的依赖项作为全局变量注入。不好的做法是不要将你的方法分组以减少你的类耦合。

【讨论】:

以上是关于从 Spring MVC 控制器访问服务层的主要内容,如果未能解决你的问题,请参考以下文章

控制器或服务层中的 Spring MVC 验证?

ASP.NET MVC 服务层输入输出数据

在DAO,服务层架构中使用spring MVC和Hibernate的正确方法是啥

MVC设计模式与三层架构

使用 Spring 从控制器层调用存储库和服务

spring mvc 的jpa JpaRepository数据层 访问方式汇总