如何将@Autowired构造函数参数单独设置为"required=false"

9 浏览
0 Comments

如何将@Autowired构造函数参数单独设置为"required=false"

我在一个@Configuration类的构造函数下使用了@Autowired注解。\n@Configuration\npublic class MyConfiguration {\n private MyServiceA myServiceA;\n private MyServiceB myServiceB\n @Autowired\n public MyConfiguration(MyServiceA myServiceA, MyServiceB myServiceB){\n this.myServiceA = myServiceA;\n this.myServiceB = myServiceB; \n }\n}\n根据Spring文档所说,我可以声明注解的依赖项是否是必需的。\n如果我将构造函数下的@Autowired注解标记为required=false,那么我是说这两个要自动装配的服务是可选的(正如Spring文档所说):\n@Autowired(required = false)\npublic MyConfiguration(MyServiceA myServiceA, MyServiceB myServiceB){\n this.myServiceA = myServiceA;\n this.myServiceB = myServiceB; \n}\n根据Spring文档:\n在多参数方法的情况下,\'required\'参数适用于所有参数。\n如何为每个构造函数参数单独设置required属性?是否需要在每个字段下使用@Autowired注解?\n谢谢!

0
0 Comments

问题的原因是在使用Spring 4.3.0.RC1版本以上的时候,可以通过给构造函数的参数添加(required = false)注解来设置@Autowired注解的参数为非必需的。这是因为Spring 4.3.0.RC1版本引入了ElementType.PARAMETER作为注解目标。

解决方法是在Spring 5.0版本中,可以将(required = false)替换为一个空的注解或者使用Kotlin的可为空类型,例如MyServiceB?。然而,即使按照这种方式使用,仍然会出现"No qualifying bean of type 'java.util.Properties' available: expected at least 1 bean which qualifies as autowire candidate."的错误。

为了解决这个问题,可以尝试以下方法:

0
0 Comments

出现的原因:

该问题的出现是因为有一个bean具有一些必需和可选的依赖项。推荐处理这种情况的方法是,只为必需的依赖项创建一个构造函数,并使用setter注入可选的依赖项。但是,使用构造函数注入时,无法将required属性设置为false。

解决方法:

可以通过在setter方法上添加`(required = false)`来将@Autowired构造函数参数设置为可选的。这样,可以在构造函数中使用必需的依赖项创建对象,并使用可选的setter设置依赖项。另外,也可以考虑使用Optional类型来包装不是必需的依赖项,以明确标记特定依赖项的可能缺失。

代码示例:

public class MyConfiguration {
   private final MyServiceA myServiceA;
   private MyServiceB myServiceB;
   
   public MyConfiguration(MyServiceA myServiceA){
     this.myServiceA = myServiceA;   
   }
   
   @Autowired(required = false)
   public void setMyServiceB(MyServiceB myServiceB) {
     this.myServiceB = myServiceB;
   }
}

另外,也可以考虑使用Optional类型来包装不是必需的依赖项,以明确标记特定依赖项的可能缺失。

代码示例:

public class MyConfiguration {
   private final MyServiceA myServiceA;
   private Optional myServiceB;
   
   public MyConfiguration(MyServiceA myServiceA){
     this.myServiceA = myServiceA;
     this.myServiceB = Optional.empty();   
   }
   
   @Autowired(required = false)
   public void setMyServiceB(MyServiceB myServiceB) {
     this.myServiceB = Optional.ofNullable(myServiceB);
   }
}

注意:根据Spring文档的规定,每个bean类最多只能有一个带有@Autowired注解的构造函数。在示例中只有一个构造函数,第二个注解位于setter方法上。可以对尽可能多的setter方法和属性进行注解。但是,该方法可能并不是最佳选择,具体取决于整个团队的决策。

0
0 Comments

问题的原因是使用@Autowired注解时,如果构造函数的参数没有找到对应的bean,则会抛出NoSuchBeanDefinitionException异常。而解决方法是使用Java 8和Spring Framework 4提供的Optional类来处理可选的依赖。

在构造函数中,可以使用Optional类作为参数的类型,并使用ifPresent方法来判断是否存在对应的bean。如果存在,则将其赋值给类的成员变量。这样可以避免在使用这些依赖时出现NullPointerException异常。

另外,也可以直接将Optional类作为类的成员变量,并在构造函数中使用orElse方法来指定默认值。这样可以更加简洁地处理可选的依赖。

然而,需要注意的是,使用Optional类作为方法参数时,Intellij的Idea会给出一个警告。这是因为Optional类的设计初衷是用于库方法的返回类型,而不适合作为字段或参数的类型。另外,如果类需要可序列化,那么使用Optional类作为字段也会有问题,因为Optional类不可序列化。

使用Optional类可以很好地处理@Autowired构造函数参数的可选性,但需要注意一些潜在的问题。

0