当前位置: 首页 > 知识库问答 >
问题:

重新检查Spring中的注入字段

从智明
2023-03-14

我有Spring控制器,它使用构造函数注入来满足服务层依赖性。效果很好。现在,在组织中有一些旧的代码来双重检查依赖关系是否有效。我认为这是一个反模式,因为它是与横切关注点相关的代码,被注入的客户端不应该担心这一点。

如果无法解析依赖关系,则 IoC 容器 (Spring) 将引发相应的错误(UnSatisfiedLink 或其他),使用这些服务的客户端应该与如何或是否正确注入这些依赖关系无关。它应该假设所有依赖项都已初始化并准备就绪。这是首先使用IoC的本质。

例如,我看到这个:

  public MyController(MyService myService) {
     this.myService = myService;
  }

然后:

@PostConstruct
public void afterPropertiesSet() throws Exception {
 if(myService == null) {   // unecessary in my opinion
   throw new IllegalArgumentException("MyService is not set!");
 }
}

这些类型的“双重检查”是不必要的,并导致横切关注点代码混乱,意见?

共有1个答案

方飞鸣
2023-03-14

我不会考虑这样的支票

if(myService == null) {
 //throw nice readable error
}

作为代码审查的一部分,我会删除这些杂乱的内容。我想更多地看到的问题是“抛出异常”部分,您现在必须将其作为此方法的一部分介绍。因此,每个调用此方法的方法现在都需要实现try/catch或re-throw实现。

我宁愿推荐一个继承自RunTimeException的Exception。

这样做的原因是,这是一个异常,存在严重的配置或设置错误。您不希望将其作为任何类型的常规功能的一部分发生。因此,我不认为任何其他方法需要“知情”,并且有一个特殊的尝试/捕获块来表现不同。应用程序基本上应该崩溃并显示异常。就在这一点上。全局服务级别上可能有一些 catch 处理程序捕获这些异常,然后(例如回滚事务)在 SoapError 等中转换异常。但一般来说,我不会考虑在抛出和显式异常中有任何额外的值,这些异常现在需要其他调用方法来实现一个特殊的 catch 块。

 类似资料:
  • 这对于初始注入/bean构建非常有效。一些网络教程建议采用这种方法。 现在,我认为可以合理地假设配置值(如果存储在DB中)可能会在运行时发生变化。因此,每当管理员更改数据库配置值时,我就会触发CDI-Event。 问题:有什么方法可以将值重新注入到已经初始化的bean实例的字段中吗?还是注入总是只与实例创建相关? 然而,我想知道一个普遍的问题:是否有任何支持重新注射?或者如果不是,规范(CDI或J

  • 注意我使用Mybatis

  • 我有下一个接口和实现: 我需要截取类的所有方法的执行,它扩展了带有注释@步骤的类。请帮我写切入点。 例如,我使用下一个切入点来截取类的方法,它由@步骤注释: 但它不工作,如果我注释只有超级类

  • 我有这个对象: 作为此回购方法的输入传递(简化): 在我所做的测试中,phaseBean以这种方式被定值: 当执行repo方法时,我得到以下错误: 我做了2个不同的测试: 注释查询的“row1”并执行方法- 因此,我确信问题在于检查:{{#phaseBean.subPhase}为null对内部对象无效<有什么建议吗?谢谢。

  • 问题内容: 考虑一下我有这行代码 恕我直言,这很容易受到SQL注入的攻击。 因此,我想通过Get / URL发送一个“ var”参数来证明它是可以尝试的,该参数将注入查询,并带有潜在的恶意代码。 我实际上尝试过: 我尝试在执行之前打印出SQL字符串查询,它实际上是2条SQL有效语句。 第一个问题,但实际上似乎mysqli-> query不会一次执行2条语句。是不是 第二个问题,我看到注入查询的一种

  • 如何将和的值注入Spring重试注释?在下面的示例中,我想用配置属性的相应引用替换maxAttempts的值和backoff值的值。