我继续学习Spring,很难弄清楚ApplicationContext
的实现是针对什么的。我是独立的J2EE应用程序,我对Web *或Portlet *实现不感兴趣。
您能否向我提供可能性的简要列表(如果不清楚,请参阅我的问题的P.S.部分)以及下面每个实现的目的:
ResourceAdapterApplicationContext
StaticApplicationContext
ClassPathXmlApplicationContext
FileSystemApplicationContext
的 P.S。 的
请你不要让我参考这些文档。例如:
ClassPathXmlApplicationContext独立的XML应用程序上下文, 从类路径中获取上下文定义文件,进行解释 普通路径作为包含包路径的类路径资源名称
但是根据该定义,不清楚ClassPathXmlApplicationContext
是否也实现了AbstractRefreshableApplicationContext
,并且可以用来在不停止服务器的情况下更改bean定义。
答案 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
实现了 JCAResourceAdapter
。需要使用JCA进行初始化javax.resource.spi.BootstrapContext
,将其传递给Spring管理 实现BootstrapContextAware
的bean。
我根本没有使用过这个,我不知道资源适配器在哪里有用,但是here are some more docs。
答案 1 :(得分:4)
只是为@Solitirios回答添加几件事:
你忘了提几个背景:
还有很多其他人。
一般情况下,GenericApplicationContext
与StaticApplicationContext
几乎相同,MessageSource
支持StaticApplicationContext
的唯一区别。这两个类的目的是使用带有几个bean的微小应用程序上下文进行小型测试。
GenericWebApplicationContext
和StaticWebApplicationContext
也非常相似,通常它们用于模拟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();
但是有几个上下文类,值得关注。考虑到你的先决条件,我会选择其中一个。
GenericXmlApplicationContext是ClassPathXmlApplicationContext
和FileSystemXmlApplicationContext
的非常好的替代品。考虑这个例子:
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。