从所有的控制器中访问一个变量

3
我正在使用Spring Boot开发我的第一个REST API。这是一项作业,但我扩展了它以学习更多知识。 实际上,控制器的代码看起来像这样:
@RestController
@EnableAutoConfiguration
@EnableSwagger2
@Api(description = "API pour l'ensemble des opérations")
public class MyServiceController {
public static void main(String[] args) throws Exception {
    SpringApplication.run(MyServiceController.class, args);
}

private Centers centers;

public MyServiceController() {
    Cage usa = new Cage(
            "usa",
            new Position(49.305d, 1.2157357d),
            25,
            new LinkedList<>(Arrays.asList(
                    new Animal("Tic", "usa", "Chipmunk", UUID.randomUUID()),
                    new Animal("Tac", "usa", "Chipmunk", UUID.randomUUID())
            ))
    );

    Cage amazon = new Cage(
            "amazon",
            new Position(49.305142d, 1.2154067d),
            15,
            new LinkedList<>(Arrays.asList(
                    new Animal("Canine", "amazon", "Piranha", UUID.randomUUID()),
                    new Animal("Incisive", "amazon", "Piranha", UUID.randomUUID()),
                    new Animal("Molaire", "amazon", "Piranha", UUID.randomUUID()),
                    new Animal("De lait", "amazon", "Piranha", UUID.randomUUID())
            ))
    );

    this.centers = new Centers();
    this.centers.addCenter(new Center(new LinkedList<>(),
            new Position(49.30494d, 1.2170602d), "Biotropica"));
    this.centers.getCenter()
            .stream()
            .findFirst()
            .get()
            .getCages()
            .addAll(Arrays.asList(usa, amazon));
}

// -----------------------------------------------------------------------------------------------------------------
// /animals
@ApiOperation(value="Récupère l'ensemble des animaux")
@RequestMapping(path = "/animals", method = GET, produces = APPLICATION_JSON_VALUE)
public Centers getAnimals(){
    return this.centers;
}...

所以,正如您所看到的一样,中心实际上存储在一个变量中(没有持久性!)。现在我想要的是将一些操作外部化(例如对/animals的每个请求都转移到AnimalsController...)。
但是问题在于:我想要在不使用持久性的情况下进行。我希望我的控制器可以访问/更新相同的变量中心,具有相同的状态,但我不太清楚该如何操作。

将它声明为静态的。但是为什么不想使用持久性? - Zakaria
@Zakaria在使用Spring框架时不建议使用static关键字。 - Lino
1个回答

3
您可以创建一个 holder 对象,并将其注册到 Spring 生命周期中:
@Component
public class CentersHolder {
     private Centers centers;

     // getter + setter
}

然后将该组件自动装配到您想要的每个控制器中。 (我建议始终使用构造函数注入,这样可以使您的代码更易于测试且通常更安全)

private final CentersHolder holder;

@Autowired
public YourController(CentersHolder holder) {
    this.holder = holder;
}

默认情况下,每个Spring组件/bean都是单例的,除非您明确告诉它不是单例的。因此,所有控制器将共享同一个实例。

用IntelliJ我遇到了“无法自动连接。未找到'CentersHolder'类型的bean”错误。 - Git Harpon
@GitHarpon,请确保你的@ComponentScan包含了声明CentersHolder的包。 - Lino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接