Java Spring multi ApplicationContext

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

根据Spring API,是:ApplicationContext

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

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

从上面看,我的问题是:

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

2)如果我在一个java应用程序中实例化两个(都在正文中),这两个接口是一个中央容器吗?还是两个单独的实例?请参阅下面的代码,和 之间有什么区别?如果 中有一个单例,则由 和 调用,它们是两个独立的实例还是同一个实例?ApplicationContextmaincontext1context2Beans.xmlcontext1context2

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

答案 1

首先你的问题:

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

ApplicationContext 是中心接口,但底层容器是 .更准确地说,是由您从中获取 Bean 的所有应用程序上下文实现的较低级别接口。从这个意义上说,我认为容器这个词在这里代表 - 每个应用程序上下文一个。BeanFactoryBeanFactoryBeanFactory

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

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

通过这些实例,您将获得2个完全独立的应用程序上下文。在第一个中声明的一个豆子不会在另一个豆子中找到。

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

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

在这里,您只能从中声明的 Bean 中检索,但从中您将从 中检索 Bean。具体来说,首先在 中查找豆类,如果未找到,则在 中查找。context1context2context2context1context2context1

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


答案 2

它们所称的容器是指核心弹簧反转控制容器。该容器提供了一种方法来初始化/引导应用程序(在 xml 文件或注释中加载配置),通过使用反射来管理 Java 对象(称为 Bean托管对象)的生命周期。

在此初始阶段,您的应用程序中没有(通常,但有可能)控制,相反,您将在引导完成后获得应用程序的完全初始化状态(或者如果它失败,则什么都没有)。

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

ApplicationContext(作为接口,并通过直接实现风格)是实现此 IoC 容器的手段,而不是 现在(一种很少使用且)更直接的管理 Bean 的方式,顺便说一下,它为 ApplicationContext 提供了基本的实现功能。BeanFactory

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


推荐