Spring容器实现

VB_*_*VB_ 4 java spring java-ee

我继续学习Spring,很难弄清楚它的ApplicationContext用途是什么.我是独立的J2EE应用程序,我对Web*或Portlet*实现不感兴趣.

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

  • ResourceAdapterApplicationContext
  • StaticApplicationContext
  • ClassPathXmlApplicationContext
  • FileSystemApplicationContext

PS

A不要求你提供给我的文档参考.例如:

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

但是根据该定义,ClassPathXmlApplicationContext还不清楚它是否也实现AbstractRefreshableApplicationContext并且可以用于在不停止服务器的情况下更改bean定义.

Sot*_*lis 6

对不起,您不希望引用文档,但这就是所有信息的所在.

StaticApplicationContext 状态

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

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

StaticApplicationContext context = new StaticApplicationContext();
context.registerBeanDefinition(beanName, beanDefinition);
Run Code Online (Sandbox Code Playgroud)

这可以在ApplicationContext需要动态更改的情况下使用.请注意,您可以通过父母ApplicationContextStaticApplicationContext,如果你既需要的行为,即.从XML/Java配置读取并动态注册.


ClassPathXmlApplicationContextApplicationContext在我看来,这是更常见的实现之一.您只需将其指向类路径上的XML(bean定义)资源,然后将其加载即可.javadoc说

适用于测试工具以及JAR中嵌入的应用程序上下文.

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

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

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

但是根据该定义,ClassPathXmlApplicationContext还不清楚它是否 也实现 AbstractRefreshableApplicationContext并且可以用于在不停止服务器的情况下更改bean定义.

这就是javadoc的用途.


FileSystemXmlApplicationContextClasspathXmlApplicationContext上面类似,但它从文件系统获取配置文件,而不是从类路径中读取资源.


ResourceAdapterApplicationContext 状态

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

我根本没有使用过这个,我不知道资源适配器在哪里有用,但这里有一些更多的文档.


n1c*_*las 5

只是将一些东西添加到@Solitirios答案:

您忘记提及其他几个上下文:

  • 通用应用程序上下文
  • GenericXmlApplicationContext
  • AnnotationConfigApplicationContext
  • GenericWebApplicationContext
  • StaticWebApplicationContext

还有许多其他。

在一般情况下,GenericApplicationContext几乎是一样的StaticApplicationContext,它们之间唯一的不同MessageSource支持StaticApplicationContext。这两个类的目的都是通过带有几个bean的小型应用程序上下文进行小型测试。

GenericWebApplicationContext并且StaticWebApplicationContext彼此非常相似,通常它们用于Servlet容器的仿真,例如测试或非Servlet环境。

Fe,您可以在代码中使用如下所示的内容(fe测试):

//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();
Run Code Online (Sandbox Code Playgroud)

但是有一些上下文类,值得关注。考虑到您的前提条件,我会选择其中之一。

GenericXmlApplicationContextClassPathXmlApplicationContext和的很好替代FileSystemXmlApplicationContext。考虑以下示例:

ApplicationContext context = new GenericXmlApplicationContext("classpath:some-context.xml");
Run Code Online (Sandbox Code Playgroud)

相当于

ApplicationContext context = new ClassPathXmlApplicationContext("some-context.xml");
Run Code Online (Sandbox Code Playgroud)

要么

ApplicationContext context = new GenericXmlApplicationContext("some-context.xml");
Run Code Online (Sandbox Code Playgroud)

相当于

ApplicationContext context = new FileSystemXmlApplicationContext("some-context.xml");
Run Code Online (Sandbox Code Playgroud)

因此GenericXmlApplicationContext看起来更灵活。

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

//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;
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到更多信息。