Spring 在启动时使用构造函数参数引导初始化 bean

Spring boot initializing bean at startup with constructor parameters

我需要在启动时初始化以下 PointQuadTree class 使用 Spring Boot with constructor parameters,并使该对象在整个应用程序中可用。构造函数参数 'minX, maxX, ...' 需要来自 application.properties 文件。

点四叉树

public class PointQuadTree<T extends PointQuadTree.Item> {

   private final Bounds mBounds;

   public PointQuadTree(double minX, double maxX, double minY, double maxY) {
      this(new Bounds(minX, maxX, minY, maxY));
   }

   ...

}

界限

public class Bounds {
   public final double minX;
   public final double minY;

   public final double maxX;
   public final double maxY;

   public final double midX;
   public final double midY;

   public Bounds(double minX, double maxX, double minY, double maxY) {
      this.minX = minX;
      this.minY = minY;
      this.maxX = maxX;
      this.maxY = maxY;

      midX = (minX + maxX) / 2;
      midY = (minY + maxY) / 2;
   }

   ...
}

我试过用@Component注释PointQuadTree,但是没有不带参数的构造函数。即使我添加了一个不带参数的构造函数Bounds也是final,所以在PointQuadTree初始化之后就不能设置了。 Bounds 也有一个只有参数的构造函数。

PointQuadTree 初始化后,我需要将它放在内存中,并且需要能够将它在其他组件中自动装配到 read/remove/add 项目。我不知道如何使用 Spring Boot.非常感谢任何帮助。

在一些配置文件中创建一个 spring 树的 bean,像这样:

@Configuration
public class PointQuadTreeBeans
{

   @Bean(name="theSameTree")
   public PointQuadTree getPointQuadTree(Environment env)
   {
      double minX = env.getProperty("minX");
      double maxX = env.getProperty("maxX");
      double minY = env.getProperty("minY");
      double maxY = env.getProperty("maxY");
      PointQuadTree tree = new PointQuadTree(minX, maxX, minY, maxY);
   }


}

并将此 class 添加到 spring componentScan

UPD

另一种方式:

而不是 double minX = env.getProperty("minX"); 您可以使用 @Value 创建字段,就像@chrylis 在评论中所说:

@Value("${minX}")
private double minX;

然后使用它字段创建bean。

这就像以 Spring 方式创建 bean 一样简单...

@Configuration
public class AppBeans{
@Value("${minx:100}")
private double minX;
...so on ..
 @Bean
   public PointQuadTree pointQuadTree()
   {
      return new PointQuadTree(minX...so on);
   }

}

然后使用 @Autowired

将这个 bean 注入到你想要的地方

此处${minx:100},尝试从属性文件中读取,如果未指定则采用默认值100