Java 我可以在不与@Service进行数据交互的情况下注释类吗?

Java 我可以在不与@Service进行数据交互的情况下注释类吗?,java,spring,spring-boot,design-patterns,Java,Spring,Spring Boot,Design Patterns,我有一个SpringBoot应用程序,它执行ETL过程,而不是web应用程序。我知道使用服务是为了分离关注点并提供松散耦合,但我可以将其用于不处理正在处理的数据的类。我有几个类放在我的服务包中,并用@service对其进行注释,例如: S3Service.java @Service public class S3Service { @Autowired private final AmazonS3 s3Client; public File downloadFile(

我有一个SpringBoot应用程序,它执行ETL过程,而不是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 {
        ...
    }

}
@Service
public FileSecurityService {

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

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

}
FileSecurityService.java

@Service
public class S3Service {

    @Autowired
    private final AmazonS3 s3Client;

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

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

}
@Service
public FileSecurityService {

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

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

}

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

关于
@Service
的事情是,现在(您对它进行了注释),您可以通过构造函数将它注入到不同的其他组件/bean/服务中(Spring Boot将注意找到它们并正确地自动连线)

例如,你可以做:

@Service
public class S3Service {

      private final AmazonS3 s3Client;


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

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

现在为了测试
S3Service
,您可以提供一个
@配置
,其中
s3Client
是一个模拟;因此,测试它非常方便。人们忘记了春天是多么容易做到这一点



什么是
@服务
与否无关-这取决于您和您的团队。我们的许多“实用程序”都是服务,因为以这种方式处理它们要容易得多。

根据您构建应用程序的方式,有不同类型的服务。春天,注解
@Service
@Repository
的灵感来自于领域驱动的设计,其中存在几种类型的服务:应用程序服务、领域服务、基础设施服务。。。您可以在其中任何一个顶部自由使用
@Service
注释

您还可以为每种类型的服务获取更具体的注释并创建自定义注释:
@InfrastructureService
@ApplicationService
@DomainService
。如果您选择使用Spring中的
@Service
对它们进行元注释,Spring将使用此注释为每个类创建一个bean

例如:

@Target(ElementType.TYPE)
@保留(RetentionPolicy.RUNTIME)
@记录
@服务
公共@接口应用程序服务{
}

我这样做是因为我认为它使我的代码更干净,但我不认为这就是服务的目的。->符合事实的它使代码更简洁,但这是一个足够好的参数吗?Spring的开发不仅仅是为了让应用程序代码看起来更干净

我很犹豫是否让它们成为实用类,因为它们是过程中的一个重要部分。->这是不是一个不让它成为实用类的好理由?仅仅因为它是一个大类,或者你有太多的方法?我不这么认为

这样使用@Service是一种不好的做法吗?->在我看来,仅仅为了拥有更干净的代码而创建bean对于创建bean和一般使用spring框架来说是不够的

当您的代码库很大、有许多包甚至更多的类时,有时读者/审阅者很难确定特定类的实例在应用程序上下文中来自何处。这就是人们创建java类并在配置类中创建bean的原因。因此,只有少数几个配置类可以创建所有bean并将其注入到应用程序上下文中


来到您的问题->您应该创建一个bean还是应该创建一个带有final关键字和静态方法的实用程序类。在我看来,您应该使用后一种方法,通常您应该始终考虑spring框架的开发思想。

我真正喜欢的“服务”是,您可以通过构造函数注入它们,从而轻松地进行模拟/测试。顺便说一句,Autowired private final AmazonS3客户端不起作用-如果您想使它成为最终的,您需要通过构造函数注入它。@Eugene我用这种方式分离它的另一个原因是它很容易测试。但我仍然不确定这些是否是“服务”。FileSecurityService类甚至没有任何注入。这只是理论。例如,仍然有人认为
@Service
@Component
对于spring是不同的。实际上,它们对框架的意义完全相同,但人们希望为它们找到不同的含义