Spring Service还是Java中生成器类的Util



我在Java(Spring Boot(项目中从Controller调用了条形码生成器方法。发电机类别如下所示:

@Component
@NoArgsConstructor
public class QRCodeGenerator {
private static final int LABEL_X_POS = 45;
private static final int LABEL_Y_POS = 20;
@Value("${qr-code.margin}")
private int margin;
@Value("${qr-code.fontSize}")
private int fontSize;
public ResponseEntity<Resource> getQRCode(String data) throws IOException {

// code omitted for brevity

addLabel(image, label);        
final ByteArrayResource resource = new ByteArrayResource(toByteArray(image));
return ResponseEntity.ok().body(resource);
}
private static byte[] toByteArray(BufferedImage image) throws IOException {
// code omitted for brevity
}
private void addLabel(BufferedImage source, String text) {
int x = LABEL_X_POS;
int y = LABEL_Y_POS;
// code omitted for brevity
}
}

首先,我开始将这个类用作static,但后来我删除了static以正确读取application.yml中的数据。

以下是我需要澄清的几点:

1.我是Spring的新手,据我所知,Spring服务通常用于从数据库或任何其他服务、端点等提供数据。这是真的吗?

2.我应该为上面的类创建一个服务吗(我不需要访问该类中的数据库(?或者这种方法更好(作为一个组件创建,然后将其注入到我的控制器中(?

3.关于静态Util类,有很多不同的意见。那么,把这个类转换成一个静态的Util类怎么样?它是比现在更好还是将其用作Spring Service?

让它成为一个spring服务,当您为控制器编写测试时,您将能够轻松地用mock代替它。否则,你将无法嘲笑它(除非你使用Powernock之类的东西(。由于您已经将值注入其中,因此将其作为Spring组件保存要容易得多。

一般来说,使用静态util类是一种过早的优化,它可能会妨碍测试。只有当静态util类只包含没有副作用的静态方法时,我才会使用它们,这些方法不需要访问配置数据,我也不介意不能模拟这些方法。我在输入验证代码中使用的方法将是我可能使用静态方法的一个例子。但是您拥有最大的灵活性,例如,如果您将配置保留为Spring组件,则可以注入配置。

以下是对您的问题的一些看法:

  1. 用@Service注释的类用于业务逻辑层,它可以提供数据,但也可以像您的情况一样执行操作
  2. 基于第1点。您可以将其作为一项服务,因为它提供了为表示层(控制器(创建qr代码的逻辑
  3. 将此类类作为@Component或更具体的@Service,可以更容易地使用依赖项注入来注入依赖项,也更容易地将类作为依赖项注入到其他bean,因此也更容易进行测试/模拟。将其保留为Spring Service是一种更好的方法

简短回答:使用Spring Service(或Component(并避免使用带有静态方法的Util类。这样你就可以在没有紧密耦合和脆弱代码的情况下过上幸福的生活

https://www.geeksforgeeks.org/coupling-in-java/

https://stackoverflow.com/a/76304657/4776689

重新安排你的3个问题:

  1. 我是Spring的新手,据我所知,Spring服务通常用于从数据库或任何其他服务提供数据,端点等等。这是真的吗

是的,这是真的,但你也可以为任何通用功能创建像@Service或@Component这样的Spring bean

  1. 我应该为上面的类创建一个服务吗(我不需要访问该类中的数据库(?或者这种方法更好(创建为一个组件,然后将其注入到我的控制器中(

是的,您应该拥有Springbean。它可以是Service或Component,也可以是任何其他bean类型。我愿意服务。

  1. 关于静态Util类有很多不同的意见。那么,把这个类转换成一个静态的Util类怎么样?是吗比现在更好还是将其用作Spring Service

如果可以,请不要使用静态Util类。Spring bean(Service和其他(被用来替换依赖注入。

最新更新