Spring容器实现

时间:2014-01-17 11:47:13

标签: java spring java-ee

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

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

  • ResourceAdapterApplicationContext
  • StaticApplicationContext
  • ClassPathXmlApplicationContext
  • FileSystemApplicationContext

P.S。

请你不要让我参考这些文档。例如:

  

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

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

2 个答案:

答案 0 :(得分:5)

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

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陈述

  

对于测试工具以及嵌入的应用程序上下文非常有用   在JARs内。

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

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

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

  

但从这个定义来看还不清楚   ClassPathXmlApplicationContext也实现了   AbstractRefreshableApplicationContext并可用于更改bean   定义而不停止服务器。

这就是javadoc的用途。


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


ResourceAdapterApplicationContext

  

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

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

答案 1 :(得分:4)

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

你忘了提几个背景:

  • GenericApplicationContext
  • GenericXmlApplicationContext
  • AnnotationConfigApplicationContext
  • GenericWebApplicationContext
  • StaticWebApplicationContext

还有很多其他人。

一般情况下,GenericApplicationContextStaticApplicationContext几乎相同,MessageSource支持StaticApplicationContext的唯一区别。这两个类的目的是使用带有几个bean的微小应用程序上下文进行小型测试。

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

F.e。你可以在你的代码中使用这样的东西(f.e. tests):

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