【问题标题】:Spring boot initializing bean at startup with constructor parametersSpring Boot在启动时使用构造函数参数初始化bean
【发布时间】:2015-03-19 14:06:18
【问题描述】:

我需要在启动时使用带有构造函数参数的 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;
   }

   ...
}

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

PointQuadTree 初始化后,我需要将它放在内存中,并且需要能够在其他组件中自动连接它以读取/删除/添加项目。我不知道如何用 Spring Boot 做到这一点。非常感谢任何帮助。

【问题讨论】:

  • 我没有时间给出完整的答案,但使用 JavaConfig 来构造 bean 并为值使用 @ConfigurationProperties

标签: java spring spring-boot


【解决方案1】:

在一些配置文件中创建一个树的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

另一种方式:

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

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

然后使用它的字段来创建bean。

【讨论】:

  • Spring 对属性注入的支持更加简洁,@ConfigurationProperties@Value
【解决方案2】:

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

【讨论】:

  • bean 现在似乎正在初始化,但是当我自动装配它时,例如AB 类,它似乎是两个类中的不同对象。如果我将项目添加到 PointQuadTreeA 中的 java.util.List,则这些项目不在 B 类中。他们是在不同的背景下还是类似的情况?
  • 我很抱歉..没有得到确切的查询..你能更新你的问题你到底在找什么吗?就上下文而言,它不是
  • 现在可以使用了。我在 bean 上添加了 @Bean(name = "pointQuadTree") 注释,然后在自动装配的对象上我还添加了 @Qualifier("pointQuadTree")
  • 这是完美的解决方案。我为 db 连接创建了一个类似的连接,只需创建一次即可用于所有 Bean。
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多