首页 > 解决方案 > 我可以在不与@Service 进行数据交互的情况下注释类吗?

问题描述

我有一个执行 ETL 过程的 Spring Boot 应用程序,而不是一个 Web 应用程序。我知道服务的使用是为了分离关注点并提供松散耦合,但我可以将它与不处理正在处理的数据的类一起使用。我有几个类放在我的服务包中并用 @Service 注释它,例如:

S3Service.java

@Service
public class S3Service {

    @Autowired
    private final AmazonS3 s3Client;

    public File downloadFile(String filename) throws Exception {
        ...
    }

    public File uploadFile(String filename) throws Exception {
        ...
    }

}

文件安全服务.java

@Service
public FileSecurityService {

    public File decryptFile(String filename) throws Exception {
        ...
    }

    public File encryptFile(String filename) throws Exception {
        ...
    }

}

我这样做是因为我认为它使我的代码更干净,但我不认为这就是服务的用途。我很犹豫是否要让它们成为实用程序类,因为它们是该过程的重要组成部分。以这种方式使用@Service 是一种不好的做法吗?如果是,我应该把这些放在哪里?谢谢你。

标签: javaspringspring-bootdesign-patterns

解决方案


问题@Service是现在(您已对其进行了注释),您可以通过构造函数将其注入到不同的其他组件/bean/服务中(Spring Boot 会注意找到它们并正确地自动装配)。

例如,您可以这样做:

@Service
public class S3Service {

      private final AmazonS3 s3Client;


      public S3Service(AmazonS3 s3Client) {
            this.s3Client = s3Client;
      }

}

s3Client当需要创建服务时, Spring 会注意查找bean S3Service

现在为了测试S3Service- 你可以提供一个@Configurationwhere s3Clientis a mock;因此测试这是非常方便的。人们往往会忘记春天是多么容易做到这一点。


什么是@Service或不是无关紧要——这取决于你和你的团队来决定。我们的一堆“实用程序”是服务,因为以这种方式处理它们要容易得多。


推荐阅读