最近在IDEA中用@Autowired注解时,发现IDEA不推荐使用这个注解了。
原因是Spring官方不再推荐这种依赖注入的方式。具体原因不再详细说明。

目前,Spring官方推荐的注入方式是构造器注入。构造器注入的优点如下:

优点:

  1. 明确依赖关系:使用构造器注入可以强制要求所有必须的依赖项在创建对象时提供,这可以帮助开发人员清晰地了解依赖项之间的关系。
  2. 可以保证对象不变性:通过将依赖项作为构造器参数传递,可以确保创建的对象在实例化后不会被修改。这有助于提高代码的可靠性和安全性。
  3. 易于测试:使用构造器注入的对象更易于测试,因为它们不会在运行时自动创建或重写依赖项。
  4. 避免循环依赖:使用构造器注入可以帮助避免循环依赖的问题,因为创建对象时所有必需的依赖项必须全部传递,而不是依赖项之间相互依赖。
    所以使用构造器注入,存在循环依赖时,会抛出异常。

但构造器注入也存在缺点,比如手写构造器代码会变成冗长和繁琐。可读性变差。

解决方案:使用@RequiredArgsConstructor + final关键字的方式。

可以使用@RequiredArgsConstructor注解来自动生成构造器,并且通过使用final关键字来确保生成的构造器参数是不可变的。这样可以省去手动编写构造器的步骤,使代码更加简洁。

使用@RequiredArgsConstructor注解时,Spring会查找这个类中未被注入的final或者@NonNull属性,然后自动生成一个构造器,参数为这些属性。如果这些属性没有设置初始值,那么生成的构造器会要求在创建对象时传入这些属性的值

@RequiredArgsConstructor
public class MyService {
    private final MyDependency myDependency;
    private final String message;
    
    public void doSomething() {
        myDependency.doSomethingWith(message);
    }
}

在上面的代码中,MyService类中的myDependency和message属性被声明为final,并且使用了@RequiredArgsConstructor注解。这样,Spring会自动生成一个构造器,参数为MyDependency和String类型的message属性。