Verwenden Sie immer noch @Autowired und @Resource?

Ich nehme am "Nuggets · Sailing Program" teil

Zunächst einmal gebe ich nicht zu, dass mein Titel im Verdacht steht, falsch, übertrieben und auslaugend zu sein, und gehe direkt zum Thema.

Zuerst durch den Boden: 我们在类上使用 Lombok的@RequiredArgsConstructor 注解来替代类中的多处@Autowired和@Resource.

Abhängigkeitsspritze

Sehen wir uns die drei Arten der Abhängigkeitsinjektion in Spring an.

  1. Eigentumseinspritzung
public class SysUserController extends BaseController {
    @Autowired
    private ISysUserService userService;

    @Resource
    private ISysRoleService roleService;
}
复制代码

@Autowired wird standardmäßig nach Typ zusammengestellt, und @Resource wird standardmäßig nach Name zusammengestellt. Wenn keine Bean gefunden wird, die dem Namen entspricht, wird sie nach Typ zusammengestellt.

Und @Qualifier wird in Verbindung mit Autowired verwendet, um den Namen der Bean anzugeben, und sie kann auch nach Namen zusammengesetzt werden.

Wenn Sie @Autowired direkt auf eine Variable in IDEA anwenden, wird eine Warnung angezeigt: Field injection is not recommended.

Der Grund dafür ist, dass offiziell empfohlen wird, die Konstruktor-Injection-Methode zu verwenden, die offensichtliche Nachteile hat, wie z. B.: Das injizierte Objekt kann nicht mit final geändert werden, und die Existenz von NullPointException kann nicht gefunden werden.

  1. Konstruktorinjektion
public class SysUserController extends BaseController {

    private final ISysUserService userService;

    private final ISysRoleService roleService;

    public SysUserController(ISysUserService userService, ISysRoleService roleService) {
        this.userService = userService;
        this.roleService = roleService;
    }
}
复制代码

Die Konstruktorabhängigkeitsinjektion wird durch den Container implementiert, der den Konstruktor einer Klasse auslöst, indem die angegebene Abhängigkeitsinjektion erzwungen wird, um den Betrieb der Klasse sicherzustellen, wodurch verhindert wird, dass NullPointerException;

Spring empfiehlt offiziell die Verwendung von Constructor Injection, nicht nur, weil in diesem Fall Member-Eigenschaften mit dem Schlüsselwort final geändert werden können, sondern vor allem, weil es zirkuläre Abhängigkeiten vermeiden kann.Wenn es zirkuläre Abhängigkeiten gibt, wird beim Start des Spring-Projekts ein Fehler gemeldet .

Warum vermeiden statt lösen?

因为构造器注入是通过构造方法来生成对象,其必须要先获取属性,才能生成调用构造方法进行实例化,这种情况的循环依赖是无法解决的。

Lassen Sie uns ein Foto machen, um zu sehen, ob Spring die zirkuläre Abhängigkeit lösen kann, wenn die beiden voneinander abhängigen Objektinjektionsmethoden von A und B unterschiedlich sind:

Konstruktorinjektion zur Lösung zirkulärer Abhängigkeiten:
1. Code-Refactoring
2. @Lazy-Anmerkung
3. Verwenden Sie stattdessen die Property-
Injektion Empfohlene Anzeige: zhuanlan.zhihu.com

  1. Setter-Injektion
public class SysUserController extends BaseController {
    
    private ISysUserService userService;

    @Autowired
    public void setUserService(ISysUserService userService) {
        this.userService = userService;
    }
}
复制代码

@AutowiredEs sollte beachtet werden, dass Sie hinzufügen oder @Resourcekommentieren müssen, wenn Sie die Setter-Injektion verwenden , da die Injektion sonst nicht erfolgreich ist.

Eine weitere zu beachtende Sache ist, dass weder Eigenschaftsinjektion noch Setter-injizierte Variablen finalmit Schlüsselwörtern geändert werden können.

@RequiredArgsConstructor

这里可能会有人说不推荐使用Lombok,只要我们知其然且知其所以然,那他就是一个帮助我们快速开发的好工具。

在说完Spring的三种依赖注入后,我们来认识一下Lombok的@RequiredArgsConstructor 注解。

在Lombok中,生成构造方法的注解一共有三个,分别是@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsContructor,我们这里只介绍@RequiredArgsConstructor。

@Controller
@RequiredArgsConstructor
public class SysUserController extends BaseController {

    private final ISysUserService userService;

    private ISysRoleService roleService;

   //----------------------------
}
复制代码

使用@RequiredArgsConstructor会为我们生成一个包含常量、使用final关键字修饰的变量私有构造方法

那我们就可以不使用属性注入(@Autowired和@Resource)的方式,直接通过构造器的方式来完成注入,不仅能够省略简化许多代码,也解决了属性注入可能存在的空指针问题。

Ich denke du magst

Origin juejin.im/post/7146035741234036744
Empfohlen
Rangfolge