@Service 被构建了两次。

35 浏览
0 Comments

@Service 被构建了两次。

我在我的Spring应用程序中遇到了一个问题,即在应用程序启动时我的@Service类被创建了两次。我知道这是我的配置问题,因为我以前遇到过这个问题,但我到底哪里做错了呢?

我的配置方式有什么本质上的问题吗?(我省略了我认为不相关的一切)

web.xml:

    myapp
    org.springframework.web.servlet.DispatcherServlet
    1


    myapp
    /


    contextConfigLocation
    
        /WEB-INF/myapp-config.xml
        /WEB-INF/myapp-security.xml
        /WEB-INF/myapp-mvc.xml
    


    com.myapp.servlet.MyAppContextListener


    org.springframework.web.context.ContextLoaderListener

myapp-servlet.xml


myapp-config.xml


admin 更改状态以发布 2023年5月21日
0
0 Comments

作为对@axtavt所给答案的补充,我想在这里提供匹配的Spring JavaConfig。

RootConfig.java中:

@ComponentScan(basePackages = { "com.myapp" },
    excludeFilters = @Filter({Controller.class, Configuration.class}))

WebMvcConfig.java中:

@ComponentScan(basePackages = { "com.myapp" },
    useDefaultFilters = false, includeFilters = @Filter(Controller.class))

0
0 Comments

除了@GaryF的答案之外,这个问题还有一个优美的解决方案(在由Spring Roo生成的项目中使用):

myapp-config.xml



    

myapp-servlet.xml



    

编辑:

myapp-config.xml中删除意味着,所有自动发现的带注解的bean都在DispatcherServlet的上下文中注册(即从myapp-servlet.xml加载的上下文)。

然而,建议的方法是使用servlet的上下文来处理特定于表示的事物(如控制器),并使用根上下文(myapp-config.xml)来处理应用程序的核心服务。上面的解决方案使这种方法更容易实现。

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

0