自定义Spring Boot Starter with commons components

时间:2018-04-20 15:55:41

标签: java spring spring-boot

我们根据相同的原则运行一些Spring启动应用程序,例如:

  • 在数据库中记录事件。
  • 处理异常的常用方法(@ControllerAdvice)
  • 使用MDC来启用我们的日志
  • 等。

今天我们使用Spring Boot父应用程序开发我们的应用程序。它工作得很好,但使用Spring Boot Starter mecanism似乎更好。

有关Spring Boot Starter最佳实践的一些问题:

  • 可以在启动器依赖项中定义一些@Controller或@Service吗?
  • 可以在启动器中使用@ControllerAdvice定义常见的异常/错误处理吗?
  • 如果不使用@Conditional ...注释,可以执行以下操作吗?

服务界面

package net.mytest.boot.starter;

public interface Tooling {
    void log(String message);
}

服务实施

package net.mytest.boot.starter;

// Is service is "allowed" inside a starter ?
@Service
public class ToolingImpl implements Tooling {
    Logger log = LoggerFactory.getLogger(Tooling.class);

    @Autowired
    RepositoryLog repositoryLog;

    public void log(String message) {
        log.debug("Logging in DB " + message);
        EntityLog entityLog  = new EntityLog(UUID.randomUUID().toString(), message);

        repositoryLog.save(eLog);
    }
}

服务配置

package net.mytest.boot.starter;

@Configuration
@ComponentScan("net.mytest.boot.starter")
@EntityScan("net.mytest.boot.starter.db")
@EnableJpaRepositories
public class ToolingAutoConfiguration {

// If @Service is not used, this allows autowiring Tooling
//    @Bean
//    public Tooling toolingConfig() {
//        return new ToolingImpl();
//    }

}

在此示例中,ToolingAutoConfiguration以两种方式使用:   - 定义Spring Boot Starter配置(@Configuration,@ ComponentScan ..)   - 提供服务(工具)

如果我们仅使用它来定义我们的Starter配置,那么提供一些没有任何@Bean或@Service的AutoConfiguration类是否有意义?

仅限初学者配置

package net.mytest.boot.starter;

@Configuration
@ComponentScan("net.mytest.boot.starter")
@EntityScan("net.mytest.boot.starter.db")
@EnableJpaRepositories
public class ToolingAutoConfiguration {
}

1 个答案:

答案 0 :(得分:1)

了解如何使用自动配置创建启动的最佳方法是检查官方的春季启动启动器。例如,spring boot web starter的自动配置。

您的大多数问题都是基于意见的,而且确实没有正确答案。我将根据我实施自动配置的经验提供我的意见。

  

在启动器中定义一些@Controller或@Service是否可以   依赖

我个人会尽可能保持从春天的清洁(避免,如果不是真的需要)。只需在配置中将实现声明为@Bean即可。这样,如果您需要添加条件(可能需要考虑多个组件),以后可以从集中的位置进行,而不是挖掘到每个单独的类。

  

使用可以定义常见的异常/错误处理是否可以   启动时的@ControllerAdvice?

我会说不。原因是@ControllerAdvice具有指定何时应用控制器建议的选项。如果初学者的用户不想向所有控制器提出建议或他们想要应用不同的建议怎么办?我会考虑更灵活的方法,也许是用户可以扩展的抽象类?

  

如果不使用@Conditional ...注释,是否可以执行此操作   以下

当自动配置的组件可能对现有应用程序产生不良副作用时,通常使用的条件,需要其他组件运行或应根据属性值打开/关闭。完全取决于您配置所需的任何内容并对任何副作用负责。

总的来说,从我看到你甚至可能不需要自动配置。您可能需要的是一组可以放在公共库中的配置类,可以单独导入@Import,并在必要时由用户进行微调。自动配置的真正威力在于隐藏配置多个组件的复杂性,这些组件协同工作,处理所有副作用,并能够从一个自动配置切换到另一个。灵活性方面更多地受自动配置作者的控制,而不是其用户。