Java Spring多个ApplicationContext

SpringContextContext的定义非常模糊,我几乎完成了整本教程,但仍然无法理解ApplicationContext代表什么。

根据Spring API, ApplicationContext是:

  • 用于为应用程序提供配置的中央接口。 这在应用程序运行时是只读的,但如果实现支持,则可以重新加载。

  • 用于访问Spring bean容器的根接口。 这是bean容器的基本客户端视图。

从上面来看,我的问题是:

1)我一直看到书中提到“容器”,容器是指什么? 一个容器是否意味着一个java进程? 或一个容器引用一个ApplicationContext对象?

2)如果我在一个java应用ApplicationContext中实例化两个ApplicationContext (都在主体中),这两个接口是一个中央容器吗? 还是两个单独的实例? 请参阅下面的代码, context1context2之间的区别是什么? 如果Beans.xml有Singleton,它由context1context2调用,它们是两个独立的实例还是同一个实例?

 ApplicationContext context1 = new ClassPathXmlApplicationContext("Beans.xml"); ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml"); 

通过容器,它们指的是核心弹簧Inversion of Control容器 。 容器提供了一种初始化/引导应用程序(在xml文件或注释中加载配置),通过使用reflection ,以及管理Java对象(称为bean托管对象)的生命周期的方法。

在此初始阶段,您在应用程序中没有(通常,但有可能)控制,而在完成引导时,您将获得应用程序的完全初始化状态(或者在发生故障时无效)。

它是所谓的EJB3容器的替代或可能的补充; 然而,spring提供了一个不遵守EJB定义标准。 从历史上看,EJB的采用受到该规范的复杂性的限制,spring是一个新创建的项目,用于在J2SE jvm上运行EJB3并且没有EJB容器,并且配置更容易。

ApplicationContext (作为一个接口 ,直接实现的风格)是实现这个IoC容器的意思,而不是BeanFactory ,它现在(一种稀疏使用的) 更直接的方式管理bean,顺便提一下ApplicationContext的基本实现function。

根据您的第二个问题,您可以拥有多个ApplicationContexts实例,在这种情况下,它们将完全隔离,每个实例都有自己的配置。

首先你提问:

1)我一直看到书中提到“容器”,容器是指什么? 一个容器是否意味着一个java进程? 或一个容器引用一个ApplicationContext对象?

ApplicationContext是中央接口,但底层容器是BeanFactory 。 更确切地说, BeanFactory是一个较低级别的接口,由您从中获取Beans的所有Application上下文实现。 在这个意义上,我认为容器这个词代表BeanFactory – 每个ApplicationContext一个。

2)如果我在一个java应用程序(一个主体)中实例化两个ApplicationContext,这两个是否与一个中央容器接口? 还是两个不同的实例? 请参阅下面的代码,context1和context2之间的区别是什么? 如果Beans.xml中有Singleton,它由context1和context2调用,它们是两个分开的实例还是同一个实例?

ApplicationContext context1 = new ClassPathXmlApplicationContext(“Beans.xml”); ApplicationContext context2 = new ClassPathXmlApplicationContext(“Beans.xml”);>

通过该实例,您将获得2个完全独立的应用程序上下文。 首先声明的一个bean在另一个中找不到。

在Web应用程序中有多个应用程序上下文是很常见的,因为Spring有一个ApplicationContext层次结构的概念。 您可以将它们声明为:

 ApplicationContext context1 = new ClassPathXmlApplicationContext("Beans.xml"); ApplicationContext context2 = new ClassPathXmlApplicationContext("Beans.xml", context1);> 

在这里,您只能从context1中检索在其中声明的bean,但是从context2您将从context2 context1检索bean。 具体来说,bean首先在context2查找,如果没有找到,则在context1查找。

这在Spring MVC中使用,您通常有一个根上下文(对于与MVC DispatcherServlet不直接相关的所有bean)和一个专用于DispatcherServlet子上下文,它将包含控制器,视图,拦截器等的bean。

我一直看到书中提到“容器”,容器是指什么? 一个容器是否意味着一个java进程? 或一个容器引用一个ApplicationContext对象?

这里的容器意味着弹簧容器,它只是ApplicationContext。 这内部读取spring配置并根据配置加载类。 你可以认为它是SpringProcessor,提供各种function,如bean初始化,注入,i18n,bean后处理等现成的

ApplicationContext context1 = new ClassPathXmlApplicationContext(“Beans.xml”); ApplicationContext context2 = new ClassPathXmlApplicationContext(“Beans.xml”);

将有两个conatiners,因此有两个单独的豆。 这里singleton意味着每个容器的单例实例。 理想情况下,除非您有两个容器,否则您应该只有一个容器。 出于学习目的,理解概念是有意义的

1)container是一个Java对象,是ApplicationContext实现之一的实例,如ClassPathXmlApplicationContext。

2)它是2个不同的容器,如果Beans.xml有一个单例bean B1,那么context1.getBean(“B1”)和context2.getBean(“B1”)将返回2个不同的B1实例

ApplicationContext是Spring容器的实现。 简单来说,Spring容器通过ApplicationContext管理整个Spring应用程序。 通过ApplicationContext的Spring容器管理Spring bean的生命周期,从启动到销毁。

spring容器嵌套在J2EE容器中。

我一直看到书中提到“容器”,容器是指什么? 一个容器是否意味着一个java进程? 或一个容器引用一个ApplicationContext对象?

容器管理对象的生命周期。 Tomcat是一个容器的例子。 就像Spring容器通过ApplicationContext管理应用程序一样,J2EE容器Tomcat通过web.xml管理应用程序

容器提供通信支持。 Web应用程序中的安全性。 JSP支持,国际化,事件传播和许多其他function。 它支持multithreading,为每个资源请求生成一个新线程。 您不必为此明确编写代码。 就像弹簧容器一样,J2ee容器管理servlet生命周期。

如果我在一个java应用程序(一个主体)中实例化两个ApplicationContext,这两个接口是否与一个中央容器相连?

如果要在应用程序中实例化多个ApplicationContexts。 它将位于父子层次结构中。 将有一个根ApplicationContext,然后将有每个DispatcherServlet的子ApplicationContext。 应用程序的Bean全局将在根ApplicationContext中定义。 所有ApplicationContexts将仅由一个弹簧容器管理。

你添加了一个“java-ee”标签。 Spring通常用于在应用程序服务器上运行的Web应用程序。 通常,每个Web应用程序都有自己的应用程序。 Web应用程序是分开的,可能就是文档中所谓的容器,因为您无法定期与不同的应用程序/容器共享变量。

您可以在应用程序中拥有两个上下文。 如果你有两个上下文,每个都有自己的单例。