2010-04-14 85 views
0

我的想法是创建一个.jar文件,其中包含服务非管理由Spring Web的应用程序和jar文件与Spring提供

由Spring管理,应该由getBean()方法

我来了想把它放到WEB-INF的WEB-INF/lib中

然后在web-app Servlets中,我想使用Jar文件的功能。

1想法。创建封装invokeation到Spring Context(getBean()等)的类 例如,我将使用的类将只获取一个参数并返回一个参数 ,但在该类中将会调用Spring的getBean等

在这种情况下,我想通过jar导入来使用Servlet是没有问题的。 只有东西,我应该在.jar里面使用什么样的上下文来获取bean,以便它在打包成jar之后起作用? ApplicationContext还是什么?

2想法。有没有另一种简单的解决方案,如何打包成jar,然后在Spring环境中使用Services进行非托管?

回答

1

这样做有很多可能性。要使用Spring,你并不需要所有东西都是Spring。

举例来说,你可以在你web.xml配置Spring:

<web-app ...> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>classpath*:com/acme/foo/applicationContext.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    ... 
</web-app> 

在你的servlet,你可以做WebApplicationContextUtils.getWebApplicationContext(servletContext).getBean("myBean")访问豆。

根据环境的不同,还有其他的集成手段。例如,您可以在JSF中使用org.springframework.web.jsf.el.SpringBeanFacesELResolverHere是Spring管理的bean的JSF应用程序示例。

+0

@lexicore你的配置片段看起来很棒(如果有效的话)。我可以问你一些细节吗?你看,在我看来,在这种情况下,我们应该把Spring管理的类放在WEB-INF/classes的某处。怎么样一个单独的.jar文件。如果所有东西都打包成jar并放入WEB-INF/lib中,这个配置是否可以工作? – EugeneP 2010-04-14 10:41:09

+1

@EugeneP当然,它的工作原理,检查我发布链接的示例项目。如果classes和applicationContext.xml位于WEB-INF/classes中,或者位于WEB-INF/lib中,则无关紧要。它们将从类路径中加载。我对此100%确信,这正是我们在许多项目中所做的。 – lexicore 2010-04-14 10:45:24

+0

我在beans.xml中使用“context:component-scan”,这可能是个问题。我编译了一个jar文件,并将其放入WEB-INF/lib中,并按照您的建议编辑了web.xml。我不明白一件事:在哪里放beans.xml?我应该将它保存在jar文件中还是放在WEB-INF目录中?我尝试了两种方法,结果是一样的:我可以获取显式存在于beans.xml中的bean,但无法获取组件扫描工作(@Autowired)。错误是:“没有名为...的bean被定义”。有任何想法吗? – EugeneP 2010-04-14 14:28:46

2

如果您在ApplicationContext上拨打电话getBean(),我不得不认为您有点漏掉了这一点。春天发明了摆脱这个确切问题。 Spring依赖于依赖注入(控制反转)的原理。这意味着您将服务注入到需要的地方,而不是按名称请求它们,并且如果它们被命名,则命名是配置而不是代码的一部分。

只要是类路径的一部分,使用来自另一个jar的类是没有问题的。他们只是像其他班级一样加载。即使他们不在课程路径中,如果需要,也可以使用ClassLoader来获得它们。其中有点复杂的地方是类在另一个JVM中。即使是这样,但听起来并非如此。

你在说什么这个参数?我强烈建议你考虑以RESTful类型的方式(在Spring 3 MVC中得到很好的支持)将命名服务绑定到某个上下文,而不是从手动加载的上下文实现某种注册表或者明确的服务位置。

+0

@cletus你是对的,但是如果你将服务视为一个整体块,那么你应该能够从某个地方获得它? getBean()是一种方法。 – EugeneP 2010-04-14 10:10:25

+0

@Eugene它是*一种方式去。这不是一个很好的方式去。这是Spring构建的隐藏你的实现细节。有充分的理由。 – cletus 2010-04-14 10:19:54

+0

我说的是这个参数。我的意思是,我构建了一个需要保存在数据库中的对象,并将其传递给ServiceLayerWraper方法。看起来好像里面没有DAO,但实际上包装类[SeviceLayerWraper]将getBean()从Spring获取一个ServiceLayer对象,并通过链传递引用对象给它。然后,ServiceLayer将它保存在一个数据库中(调用它的依赖,DAO)。 – EugeneP 2010-04-14 10:50:20

相关问题