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

时间:2015-01-21 06:12:23

标签: java spring spring-boot

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

PointQuadTree

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;
   }

   ...
}

我尝试使用PointQuadTree注释@Component,但没有没有参数的构造函数。即使我添加不带参数Bounds的构造函数为final,也不能在PointQuadTree初始化后设置。另外Bounds有一个只带参数的构造函数。

初始化PointQuadTree后,我需要它在内存中,并且需要能够在其他组件中自动装配它以读取/删除/添加项目。我不知道如何使用Spring Boot执行此操作。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:7)

这就像以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

答案 1 :(得分:1)

在某个配置文件中创建一个tree bean的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);
   }


}

并将此类添加到spring componentScan

<强> UPD

另一种方式:

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

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

然后使用它来创建bean。