gpt4 book ai didi

java - 什么时候使用 Spring Container 的多个实例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:57:11 25 4
gpt4 key购买 nike

我正在使用 ApplicationContext 作为 Spring 容器。

但是,由于我不想更改我的 API,所以我觉得需要使用容器的多个实例,如下所示 -

public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");

...
objA = context.getBean(...);
objB = context.getBean(...);
}

// code for Class A

public void execute() // <-- cannot change this signature
{
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
objC = context.getBean(...); // earlier, this was objC = new C();
objC.method1("...");
}

所以我最终使用了两个不同的 ApplicationContext 实例。什么时候适合,什么时候不适合拥有多个 ApplicationContext 实例?

最佳答案

对于大多数应用程序,应该不需要多个 ApplicationContext。主要限制是您不能跨容器共享 bean 实例。从技术上讲,您没有理由不能将它们分成两个容器,但我敢肯定会有一些您想要共享的通用 bean,例如数据源和通用业务层等。

查看您的示例,我建议您允许类 A 接受 SpringApplication 上下文作为构造函数(或者您可以使用 setter 方法)

public class A {

private ApplicationContext ctx;

public A(ApplicationContext applicationContext) {
ctx = applicationContext;
}

public void execute() {
// do stuff with beans retrieved from "ctx"
}
}

您的 main() 将启动;上下文并将其传递给 A

的实例
public class MyMain {

public static void main(String[] args) {

A a = new A(SpringContextFactory.getInstance());

a.execute();
}
}

作为优秀设计的额外部分,将您创建的上下文封装在工厂类中

public class SpringContextFactory {

public static ApplicationContext getInstance() {

String[] contextXml = new String[]{ "resources/spring-context.xml",
"resources/spring-db.xml" };

return new ClassPathXmlApplicationContext(contextXml);
}
}

我发现这个设置很适合我的单元测试

关于java - 什么时候使用 Spring Container 的多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11000459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com