【问题标题】:Spring container implementationsSpring容器实现
【发布时间】:2014-01-17 11:47:13
【问题描述】:

我一直在学习 Spring,但很难弄清楚 ApplicationContext 的哪个实现是针对的。我有独立的 J2EE 应用程序,我对 Web* 或 Portlet* 实现不感兴趣。

您能否提供一下可能性的简要列表(如果不清楚,请参阅我的问题的 P.S. 部分)以及以下每个实现的目的:

  • ResourceAdapterApplicationContext
  • StaticApplicationContext
  • ClassPathXmlApplicationContext
  • FileSystemApplicationContext

附言

不要要求您向我提供对文档的参考。例如:

ClassPathXmlApplicationContext 独立的 XML 应用程序上下文, 从类路径中获取上下文定义文件,解释 普通路径作为包含包路径的类路径资源名称

但从该定义来看,ClassPathXmlApplicationContext 是否也实现了AbstractRefreshableApplicationContext 并且可以用于在不停止服务器的情况下更改 bean 定义。

【问题讨论】:

  • 独立 JEE 应用程序意味着 Swing?
  • 没有。 Java + Spring IoC + 通过 Websockets + Backbone.js 进行通信来处理客户端的路由。
  • 我对 “我对 WEB 或 Portlet 实现不感兴趣” 这句话感到困惑。您是使用 Servlet API 还是直接使用 Web 套接字?
  • 我正在直接使用 WebSockets
  • 我知道 JavaEE。什么是 JEE?

标签: java spring jakarta-ee


【解决方案1】:

很抱歉,您不想参考文档,但这就是所有信息所在。

StaticApplicationContext 状态

org.springframework.context.ApplicationContext 实现哪个 支持 bean 和消息的编程注册,而不是 从外部配置源读取 bean 定义。主要是 对测试有用。

所以你用它直接注册bean定义

StaticApplicationContext context = new StaticApplicationContext();
context.registerBeanDefinition(beanName, beanDefinition);

这可用于您的ApplicationContext 需要动态更改的情况。请注意,如果您需要这两种行为,则可以将父 ApplicationContext 传递给 StaticApplicationContext,即。从 XML/Java 配置读取并动态注册。


ClassPathXmlApplicationContext 在我看来是更常见的ApplicationContext 实现之一。您只需将它指向类路径上的 XML(bean 定义)资源,然后它就会加载它。 javadoc 状态

对于测试工具以及嵌入的应用程序上下文很有用 在 JAR 中。

因此,您可以简单地指向来自 JAR 的类路径上的资源并加载它。以这种方式设置测试环境就足够了。

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("some-context.xml");
// boom you're ready to go

请注意,Spring 的 JUnit 支持类提供了其他(更好的)设置测试环境的方法。

但从这个定义来看,并不清楚 ClassPathXmlApplicationContext 也实现了 AbstractRefreshableApplicationContext 可以用来换豆子 无需停止服务器即可定义。

这就是 javadoc 的用途。


FileSystemXmlApplicationContext 类似于上面的ClasspathXmlApplicationContext,但它从文件系统中获取配置文件,而不是从类路径中读取资源。


ResourceAdapterApplicationContext 状态

org.springframework.context.ApplicationContext 的实现 JCAResourceAdapter。需要用 JCA 初始化 javax.resource.spi.BootstrapContext,将其传递给 Spring 管理 实现BootstrapContextAware的bean。

我根本没有使用过这个,我不知道资源适配器在哪里有用,但是here are some more docs

【讨论】:

  • 该实现是否还有其他有趣的功能? (如动态配置刷新)如果是,只需重新计算它们。我问是因为我没有找到。
  • @VolodymyrBakhmatiuk 我不明白你的问题。你能改写一下吗?
  • 是的,我的意思是ClassPathXmlApplicationContextFileSystemXmlApplicationContext 都实现了AbstractRefreshableApplicationContext 并且可以动态添加bean 定义。对我来说,这是非常有趣(在某些情况下有用)的能力。所以我只是问这 4 个容器实现中是否还有其他这样的能力。
  • @VolodymyrBakhmatiuk 如果您有 IDE,请打开您感兴趣的类(您将需要源代码)并查找类型层次结构。你可以看到所有的超级类型。继承的每种类型都提供了自己的一组功能。这里的答案太多了。
【解决方案2】:

只是在@Solitirios 回答中添加几件事:

你忘了提几个上下文:

  • GenericApplicationContext
  • GenericXmlApplicationContext
  • AnnotationConfigApplicationContext
  • GenericWebApplicationContext
  • StaticWebApplicationContext

还有很多其他的。

一般来说,GenericApplicationContextStaticApplicationContext 几乎相同,它们之间的唯一区别在于MessageSource 支持StaticApplicationContext。这两个类的目的是用于带有几个 bean 的小型应用程序上下文的小型测试。

GenericWebApplicationContextStaticWebApplicationContext 也很相似,通常用于模拟 Servlet 容器,例如测试或非 Servlet 环境。

F.e.你可以在你的代码中使用这样的东西(例如测试):

//create parent context
ApplicationContext xmlContext = new GenericXmlApplicationContext("classpath:/spring-*.xml");
//create mock servlet context
MockServletContext mockServletContext = new MockServletContext();
//create web context
GenericWebApplicationContext webContext = new GenericWebApplicationContext(mockServletContext);
//set attribute
mockServletContext.setAttribute(GenericWebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, webContext);
//set parent context
webContext.setParent(xmlContext);
//refresh context
webContext.refresh();

但是有几个上下文类值得关注。考虑到你的先决条件,我会选择其中之一。

GenericXmlApplicationContextClassPathXmlApplicationContextFileSystemXmlApplicationContext 的很好替代品。考虑这个例子:

ApplicationContext context = new GenericXmlApplicationContext("classpath:some-context.xml");

等价于

ApplicationContext context = new ClassPathXmlApplicationContext("some-context.xml");

ApplicationContext context = new GenericXmlApplicationContext("some-context.xml");

等价于

ApplicationContext context = new FileSystemXmlApplicationContext("some-context.xml");

所以GenericXmlApplicationContext 看起来更灵活。

AnnotationConfigApplicationContext 是上下文持有者,如果您不想将 bean 保存在 XML 文件中。

//context creation
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);

//context class
    @Configuration
@ComponentScan("com.examples.services")
public class AppConfig {

    @Bean
    public DataSources dataSource() {
        DataSource ds = new BasicDataSource();

        //... init ds

        return ds;
    }

}

更多信息您可以找到here

【讨论】:

  • 谢谢!还有GenericApplicationContextStaticApplicationContext有什么区别
  • 您说通用(静态)-WebApplicationContext 用于模拟 Servlet 容器,例如非 Servlet 环境。因为有人会想要这样做。请解释一下
猜你喜欢
  • 2011-03-06
  • 2011-02-18
  • 2019-04-27
  • 1970-01-01
  • 2023-03-27
  • 2010-12-15
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
相关资源
最近更新 更多