当前位置: 首页 > 知识库问答 >
问题:

Spring中的新功能:加载应用程序上下文

百里骏
2023-03-14

我刚接触Spring。

到目前为止,在我的应用程序中,每次我需要使用bean时,我都会加载XML。

Application Context上下文=new ClassPathXmlApplication ationContext("Applicationontext.xml");

因此,在每个需要加载特定bean的类中,我都使用上面的行。

在效率或正确使用方面,我想知道这是否是正确的使用(我怀疑不是),或者上下文是否应该在每个类需要时作为参数传递。

谢谢

共有3个答案

阎鹏
2023-03-14

只需加载XML文件并创建应用程序上下文对象。只要加载了XML,Spring就会注入所有对象依赖项。

所以,您不需要反复加载或创建应用程序上下文对象。只需使用下面的示例检查控制台,您就会理解它。

示例:在main方法中,您只编写这行代码。

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

interface IParent {
    public void whoAreYou();
}

class ChildA implements IParent {

    public ChildA (IParent ChildB) {
        super();
        System.err.println("Constructor ChildA ");
        ChildB.whoAreYou();
    }

    public ChildA (){
        System.err.println("Constructor ChildA ");
    }

    @Override
    public void whoAreYou() {
        System.err.println("ChildA ");
    }

}

class ChildB implements IParent {

    public ChildB (){
        System.err.println("Constructor ChildB");
    }

    @Override
    public void whoAreYou() {
        System.err.println("ChildB");

    }
}

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">


   <context:annotation-config/>

   <bean id="childA" class="com.spring.xmlbased.config.ChildA">
       <constructor-arg>
           <bean id="ChildB" class="com.spring.xmlbased.config.ChildB"/>
       </constructor-arg>
   </bean>
</beans>

请让我知道,如果你需要进一步澄清。

孟海
2023-03-14

如果您使用Spring,那么您应该在任何地方使用它。因此,与其传递应用程序上下文,不如将每个bean放在其中,让Spring为您连接点。

简而言之,永远不要自己调用new。向Spring询问bean。如果bean有依赖关系,请使用构造函数注入。

这样,Spring就可以为您创建所有bean,将它们连接起来并返回完全工作的实例,而无需担心某些东西从哪里形成。

您还应该阅读有关基于Java容器配置的文章。

相关文章:

  • Spring示例:基本构造函数注入
  • 基于Spring构造函数的依赖注入
柳胜
2023-03-14

我假设您正在非web应用程序中使用Spring。

如果每次需要检索bean时都要创建新的应用程序上下文,那么这确实不是正确的解决方案。您应该为每个应用程序创建一次应用程序上下文。

因此,解决方案将如您所建议的那样,将应用程序上下文实例传递给需要它的类,或者以其他方式确保您在应用程序中使用相同的实例。

您在当前设置中可能遇到的许多问题之一是bean范围的问题。Spring有单例bean,但它们仅在一个应用程序上下文中是单例。因此,如果您从两个不同的应用程序上下文中检索单例bean,它们将不是同一个实例。其他问题将涉及性能,因为创建应用程序上下文将是昂贵的操作。

 类似资料:
  • 我正在处理一个Spring Boot应用程序,其中我使用该应用程序公开SOAP WebService。我在Spring boot应用程序中使用Apache CFX framework for SOAP impl。我正在使用基于注释的方法。 我在一个bean中的Spring Boot配置文件中设置应用程序上下文时遇到了问题。下面是我的代码。 配置文件如下所示。 现在我有了bean SOAPproce

  • 问题内容: 我需要在测试类的单个方法中更改applicationContext中活动的Spring概要文件,并且由于我使用的是ProfileResolver,因此在刷新竞赛之前,我需要运行一行代码。我尝试了以下方法: 但是我得到: DirtiesContext对我不起作用,因为它是在类/方法执行之后而不是之前运行的,并且无论如何我都需要在运行刷新/重新加载之前执行一行代码。 有什么建议?我试图查看

  • 问题内容: 我有一个包含2个测试的测试类: 当我单独运行测试时,我不会出错,但是当我同时运行所有测试时,会失败。失败是由于某些测试修改了应用程序上下文导致的: 是否可以单独运行此测试?我只想在启动test1时读取所有必需的东西,然后运行测试,然后关闭所有必需的东西。然后启动test2。 问题答案: 您可以在修改应用程序上下文的测试类上使用@DirtiesContext批注。 Java文档 Spri

  • 我有一个相当简单的设置。一个包含3个模块的maven项目:core/webapp/model。我正在使用Spring boot来升级我的应用程序。在webapp中,我有一个简单的类WebappConfig如下: 当我部署abcd.war时,applicationcontext加载了两次,并导致以下错误stracktrace: 不存在我前面提到的web.xml。 一些有趣的事情,我不知道为什么: n

  • 我在我的src/test/resources路径中创建了一个application-integrationtest.yaml,所以我的测试是针对创建的docker TestContainer运行的。问题是没有加载我的application-integrationtest.yaml。 我正在运行一个SpringBoot2.x应用程序 原因:org.springframework.beans.Bean

  • 我正在将webapp中使用的spring框架版本从3.1.4升级到4.1.8。在新的Spring版本中,我们的一些单元测试失败了,因为@AutoWired不再工作。这是失败的测试之一: } 这是math-application-context文件: 我还尝试使用应用程序上下文加载bean,但失败了,出现了以下异常: 如果删除autowired字段,测试将失败,并且通过超类中的应用程序上下文加载的另