Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @RequiredArgsConstructor(onConstructor=@u U(@Inject))和@RequiredArgsConstructor之间有什么区别?_Java_Spring_Lombok_Inject - Fatal编程技术网

Java @RequiredArgsConstructor(onConstructor=@u U(@Inject))和@RequiredArgsConstructor之间有什么区别?

Java @RequiredArgsConstructor(onConstructor=@u U(@Inject))和@RequiredArgsConstructor之间有什么区别?,java,spring,lombok,inject,Java,Spring,Lombok,Inject,龙目山与龙目山有什么区别 @RequiredArgsConstructor 及 我知道,RequiredArgsConstructor只在构造函数中注入所有最终依赖项。第二个将把您提到的注释放在生成的构造函数上 例如,这个:@RequiredArgsConstructor(onConstructor=@_u(@Inject)) 将生成带有@Inject @RequiredArgsConstructor class MyClass { private final DependencyA a

龙目山与龙目山有什么区别

@RequiredArgsConstructor 


我知道,
RequiredArgsConstructor
只在构造函数中注入所有最终依赖项。

第二个将把您提到的注释放在生成的构造函数上

例如,这个:
@RequiredArgsConstructor(onConstructor=@_u(@Inject))
将生成带有
@Inject

@RequiredArgsConstructor
class MyClass {
  private final DependencyA a;
  private final DependencyB b;
}
将产生

public MyClass(DependencyA a, DependencyB b) {
  this.a = a;
  this.b = b;
}

@RequiredArgsConstructor(onConstructor = @__(@Inject))
class MyClass {
  private final DependencyA a;
  private final DependencyB b;
}
将产生

@Inject
public MyClass(DependencyA a, DependencyB b) {
  this.a = a;
  this.b = b;
}
从JDK 8开始,还接受语法
@RequiredArgsConstructor(onConstructor \={@Inject})

我知道
RequiredArgsConstructor
注入所有最终依赖项


所有必需的依赖项,包括
final
@NonNull
字段。

我将用简单的示例解释这些注释

何时使用@RequiredArgsConstructor

香草爪哇

如果您有一个或多个字段是final(非null),则使用@RequiredArgsConstructor

龙目爪哇岛

何时使用@RequiredArgsConstructor(onConstructor=@uu(@Inject))

香草爪哇

如果您有一个具有自己类型的字段,那么将在配置类中创建bean实例。然后,您可以在@RequiredArgsConstructor(onConstructor=@\uuuUuUuUUUUUUUUUUUZ(@inject))的帮助下,使用构造函数注入将该bean实例注入到Item类的shop字段中

但我的建议是不要使用@RequiredArgsConstructor(onConstructor=@u u(@Inject)) 当您使用Spring时。你可以通过两种方式克服它

  • 使用@Autowired注释

    @AllArgsConstructor
      public class Item {
    
                     private final Shop shop;
    
             }
    
    公共类项目{

             private final Shop shop;
    
          @Autowired
          public Item(Shop shop)
         {
             this.shop=shop;
         }
     }
    
  • 使用@AllArgsConstructor注释

    @AllArgsConstructor
      public class Item {
    
                     private final Shop shop;
    
             }
    
  • 我将为某人的帮助添加一个额外的点

    何时使用@AllArgsConstructor

    香草爪哇

    如果有一个或多个字段不是final(可为null),则使用@AllArgsConstructor

    龙目爪哇岛

    注意

    @allargsconstuctor可用于final和non-final字段


    @RequiredArgsConstructor不能与非最终字段一起使用。

    给出的答案清楚地解释了OP所要求的区别。但是我也觉得知道为什么需要
    @RequiredArgsConstructor(onConstructor=@Inject))
    而不是
    @requiredArgs构造函数也很重要。如果您感兴趣,请继续阅读

    简而言之,当Spring构建bean时(用@Component或相关@Controller、@Service、@Repository注释的类-它们都有@Component+额外的功能),Spring将需要查看类构造函数来构造它。如果类中只有一个构造函数,很好,没有混淆,您只需要
    @RequiredArgsConstructor

    如果您有两个或更多构造函数呢?Spring使用哪一个来构造您的bean?输入
    @RequiredArgsConstructor(onConstructor=@\uUu(@Inject))
    更流行的@RequiredArgsConstructor(onConstructor=@\uUu(@Autowired))
    。正如注释的属性所说,它将@Autowired放在构造函数上,告诉Spring在构造时使用该构造函数

    就这样!


    注:如果您想了解更多,我建议您。

    N.B.从Spring 4.3开始,如果只有一个构造函数,您就不再使用
    @Inject
    /
    @Autowired
    。因此,在这种情况下,给定的示例中没有有效的区别。您的意思是“this.shop=shop;”而不是“this.price=price;”,对吧?谢谢。这是个错误,修改了答案
    public class Item {
            
                private final Shop shop;
        
             public Item(Shop shop)
            {
                this.shop=shop;
            }
        }
    
             private final Shop shop;
    
          @Autowired
          public Item(Shop shop)
         {
             this.shop=shop;
         }
     }
    
    @AllArgsConstructor
      public class Item {
    
                     private final Shop shop;
    
             }
    
    public class Item {
    
        private String price;
    
     public Item(String price)
    {
        this.price=price;
    }
    
    }
    
    @AllArgsConstructor
    public class Item {
    
        private String price;
    
    }