注释顺序在SB应用程序中重要吗?



在我看来,以不同的顺序进行注释会破坏我的构建。

批注顺序重要吗?

上面的答案说,一般来说,注释顺序应该无关紧要。就我而言,它正在破裂。

这是模块公地

@ConditionalOnProperty(value = "calculatorEnabled", havingValue = "true")
@Component
class Calculator {
// some logic
}
@ConditionalOnBean(Calculator.class)
@Service
class CalculationService {
private final Calculator calculator;
@Autowired
public CalculationService(final Calculator calculator) {
this.calculator = calculator;
}
// some logic
}
@RequestMapping(value = "/calculations", produces = MediaType.APPLICATION_JSON_VALUE)
@ConditionalOnBean(CalculationService.class)
@RestController
class CalculationController {
}

让我们有另一个模块 - 高级计算

它有模块共享作为依赖(Maven依赖(。

请注意,有两个故意的 maven 模块。 因此CalculationController在其他使用共享依赖的模块中可用。

现在,让我在高级计算中进行两个测试。(同样,我决定在另一个模块中测试CalculationController(。

我知道最好在实际定义组件的模块中进行测试,但是commons模块很久以前就由其他团队编写;现在我们必须使用它。

我想确保如果我们更新共享资源版本,应用程序应该不会中断(API 不应该改变(。因此,我在高级计算模块中添加了CalculationContrioller集成测试。

@SpringBootTest(classes = [AdvancedCalculationApplication.class],properties = ["calculatorEnabled=true" ])
@AutoConfigureMockMvc
AdvancedCalculationsITTest extends Specification {
}

@SpringBootTest(classes = [AdvancedCalculationApplication.class],properties = ["calculatorEnabled=" ])
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
@AutoConfigureMockMvc
AdvancedCalculationsITTestsDisabled extends Specification {
}

mvn clean install失败是因为AdvancedCalculationsITTest失败。错误无法自动连线CalculationController因为没有候选calculationService

但是,当我稍微改变注释的顺序时,它可以工作

@ConditionalOnBean(CalculationService.class)
@RequestMapping(value = "/calculations", produces = MediaType.APPLICATION_JSON_VALUE)
@RestController
class CalculationController {
}

我会更新这个答案,但稍后再说。

对我来说待办事项。 (我将做一个演示并添加一个指向 github 的链接并放置一些代码示例(。

欢迎您提出意见和建议!

我在一个方法上有 2 个自定义注释 (RUNTIME(:一个注释使方法始终抛出异常@Exceptional,另一个@Catchable始终捕获异常。为简单起见,让此方法返回void。通过按不同的顺序放置这些注释,您应该得到不同的结果。

@Catchable
@Exceptional
public void processAction() {
// There is nothing that throws an exception.
safeStatement1();
safeStatement2();
safeStatementN();
}

@Exceptional
@Catchable
public void processAction() {
// There is nothing that throws an exception.
safeStatement1();
safeStatement2();
safeStatementN();
}
By having these annotations in different order, the result should be different.

最新更新