Spring原型到单例并在另一个类中获得值

时间:2017-04-26 19:42:26

标签: java spring spring-boot

A 是bean范围原型

@Component
scope("prototype")
Class A{

}

Class B 属于bean范围Singleton有getter和setter A

@Component
Class B{

@Autowire
private A a;

 public A getA() {
        return a;
    }

    public void setA(A a) {
        this.a = a;
    }

}

C 课程中, B 自动装配并设置 A

的对象
Class C{

@Autowire
private B b;

// other code

b.setA(a);

}

如何使用spring Annotations或使用XML

在D类中使用B获取A的值

1 个答案:

答案 0 :(得分:1)

据我所知,在您的项目中,您希望将组件 D 与组件 C 分开,或者您只是遇到无法生成的情况组件 A ,不涉及 C B

这里的问题是,你错过了更好地解释你的情况。

正如我在评论中所写,这里错过了许多信息。

我的第一个建议是:问问自己组件 A 是否真的应该是一个组件。

使用范围(" prototype")注释类,这意味着每次访问bean时都会得到一个新的实例。

但是只有通过Spring框架才能访问。

您在OP中公开的逻辑无法确定,因为您访问普通的java对象。

请记住,如果出于某种原因, A 只是在适当的时间实例化,而不是获得 null 值,并且必须相应地处理它与您的业务逻辑。

当您需要使用它时,您必须获取 A 实例或尝试构建它。 我知道你认为你是在 D 中做的,而不是在 B 中,其中 A 已保存,所以你指向一个潜在的错误对象。

我建议您删除 B A 的依赖关系。

在组件 C 中添加注释 @Configuration ,然后您应该创建一个使用 @Bean 注释的方法,如:

@Bean
public A getA() {
     // put here the code to create A and that involves B
     return a;
 }

然后,从您的组件 D ,您可以通过访问应用程序上下文here来获取 A bean,您可以获得有关如何执行此操作的详细信息。但请记住,不建议将其作为最佳实践。

所有这些考虑因素都是对你到目前为止所写内容的猜测,并且很多细节可能会使所有人无效。

请分享更详细的问题以获得正确答案。我希望这可以帮助你弄清楚至少可以理解你的情况,如果无法解决的话。