【问题标题】:Prototype spring bean giving me only one instance of the class原型spring bean只给我一个类的实例
【发布时间】:2019-09-23 15:56:09
【问题描述】:

我目前正在学习 Spring Boot。和代码一样,我已经用原型bean编写了范围注释。

@Component
@Scope(value = "prototype")
public class ninja {
    // constructor
    public ninja() {
        System.out.println("object created");
    }
}

我希望它可以让我在调用 getBean 函数时创建多个对象。

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {

        // creating first instance
        ninja obj = SpringApplication.run(DemoApplication.class, args).getBean(ninja.class);

        // creating second instance
        ninja obj1 = SpringApplication.run(DemoApplication.class, args).getBean(ninja.class);

    }

}

但我在调用getBean()两次后只得到一个实例,创建的对象是构造函数正在打印的文本,应该打印两次。

我在这里缺少什么?谢谢。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    您基本上是在初始化 spring 应用程序两次。因此,您将获得每次都不同的应用程序上下文。如下更改并查看输出:

    ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
    
    Ninja obj = getBean(Ninja.class);
    Ninja obj1 = getBean(Ninja.class);
    

    注意:我已根据 java 命名约定更改了名称,我建议您遵循相同的名称。

    【讨论】:

      【解决方案2】:

      如果您注入的目标对象不同,Prototype 只会创建另一个对象。由于您在同一方法中注入两次,因此您将获得相同的实例。尝试创建一个原型范围的工厂,然后注入这个工厂。

      【讨论】:

      • 您好,作用域原型的意思是每次调用它时都会创建一个新实例(无论使用工厂)。这里的问题更多是因为她两次创建应用上下文
      【解决方案3】:

      那是因为你在同一个类中调用它,如果你想看看原型作用域是如何工作的,你可以这样做:

      1. 使用 @RestController 创建 2 个控制器
      2. 使用 @Service 和 @Scope("prototype") 创建 1 个服务
      3. 让每个带有@Autowired 的控制器都带有该服务类型的字段。

      在此示例中,每个控制器将获得定义为服务的类的不同实例。您可以通过在 Service 方法中调用 #hashCode 进行测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-14
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2018-09-03
        相关资源
        最近更新 更多