当前位置: 首页 > 面试题库 >

@Service被构造两次

慕承恩
2023-03-14
问题内容

我的Spring应用程序有一个问题,该应用程序启动时会两次创建我的@Service类。我知道这是我的配置存在的问题,就像我以前经历过的那样,但是我到底在做什么错呢?

我在下面布置配置的方式有什么根本错误吗?(我忽略了我认为无关的所有内容)

web.xml:

<servlet>
    <servlet-name>myapp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>myapp</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/myapp-config.xml
        /WEB-INF/myapp-security.xml
        /WEB-INF/myapp-mvc.xml
    </param-value>
</context-param>

<listener>
    <listener-class>com.myapp.servlet.MyAppContextListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

myapp-servlet.xml

<context:component-scan base-package="com.myapp" annotation-config="true" />
<mvc:annotation-driven />

myapp-config.xml

<context:component-scan base-package="com.myapp" annotation-config="true" />
<context:annotation-config />

问题答案:

除了@GaryF的答案外,还有以下针对该问题的漂亮解决方案(用于产生的项目中Spring Roo):

myapp-config.xml

<!-- Load everything except @Controllers -->
<context:component-scan base-package="com.myapp">
    <context:exclude-filter expression="org.springframework.stereotype.Controller"
        type="annotation"/>
</context:component-scan>

myapp-servlet.xml

<!-- Load @Controllers only -->
<context:component-scan base-package="com.myapp" use-default-filters="false">
    <context:include-filter expression="org.springframework.stereotype.Controller" 
        type="annotation"/>
</context:component-scan>

编辑:

<context:component-scan>从中删除myapp-config.xml意味着,所有自动发现的带注释的Bean都在DispatcherServlet的上下文(即从中加载的上下文myapp-servlet.xml)中注册。

但是,推荐的方法是将servlet的上下文用于特定于表示的内容(例如控制器),并将根上下文(myapp-config.xml)用于应用程序的核心服务。上面的解决方案使此方法变得容易。

关于实际考虑,当你将核心服务放在servlet的应用程序上下文中时,不能从该servlet的范围之外访问它们,例如,从另一个servlet进行访问(你可能需要使用另一个servlet来实现另一种访问技术)或过滤器(例如Spring Security过滤器)。这就是在根应用程序上下文中拥有核心服务的原因。



 类似资料:
  • 我的react组件的构造函数被调用了两次,但我不知道为什么。我正在使用react redux存储我的应用程序的语言。我有一个基于浏览器语言设置默认语言的函数。LoginPage是第一个获得render的组件,因此我在其构造函数中调用了我的函数。基本上,它所做的就是比较并分派一个动作。当我用redux开发工具检查我的状态时,我看到它被调度了两次。我在构造函数中打印了虚拟数据,它也打印了两次。 登录页

  • 正如我的类名所暗示的那样:如果我的类是迭代器的实例,我想测试一下。因此,我想知道,如果它只需要实现接口就可以这样做,似乎就足够了。 然而,当我通过JUNIT Test运行以下类时,我得到了以下控制台输出: 似乎类构造函数被调用了两次!但是我不知道第二次调用来自哪里。我已经测试了“if”参数的变体以排除有故障,例如 然而,它在所有3种情况下都被调用了。因此,我假设Unit Test首先尝试,需要为自

  • 我是新的反应,我试图用它开发一个简单的网络应用程序,但我得到了一个错误。当我加载一个类组件时,我的构造函数被调用两次,你能帮忙吗? 原木地被击中两次。在一些组件中,我希望进行一个命中DB的API调用,但我只想命中它一次。在许多情况下,使用并不方便,因为道具只出现在之后,因此我想在中调用(我不会使用setState,这会导致重新加载render)。 提前感谢

  • 问题内容: 我正在使用Spring Data Commons v2 +快照,并且看到a的构造函数已被弃用。这似乎发生在M1和M2之间。不幸的是,这是该接口的唯一[真实]实现。我想知道努力的方向,对于当前的开发有什么更好的选择。 问题答案: 只是已弃用的构造函数。代替 您现在可以使用 就是这样。

  • 本文向大家介绍构造器 Constructor 是否可被 override?相关面试题,主要包含被问及构造器 Constructor 是否可被 override?时的应答技巧和注意事项,需要的朋友参考一下 在讲继承的时候我们就知道父类的私有属性和构造方法并不能被继承,所以 Constructor 也就不能被 override(重写),但是可以 overload(重载),所以你可以看到一个类中有多个构

  • 问题内容: 我正在尝试创建对象Iset的实例。当人创建对象时,他们必须给出一个整数,该整数将是一个布尔数组的大小,该布尔数组将存储一组整数,例如1将是Iset [1] = true等。但是我一直使索引超出范围错误。程序的其余部分显然会忽略我在构造函数中设置的值,那么如何确保在我的所有方法中都使用构造函数中使用的值? 代码的第一部分: 问题答案: 让我们看看您的代码: 在构造函数中,您已经看到创建了