¿Sigues usando @Autowired y @Resource?

Estoy participando en el "Programa de Vela · Nuggets"

En primer lugar, no admito que se sospeche que mi título es falso, exagerado y agotador, y voy directo al tema.

Primero por la parte inferior: 我们在类上使用 Lombok的@RequiredArgsConstructor 注解来替代类中的多处@Autowired和@Resource.

inyección de dependencia

Repasemos los tres tipos de inyección de dependencia en Spring.

  1. inyección de propiedad
public class SysUserController extends BaseController {
    @Autowired
    private ISysUserService userService;

    @Resource
    private ISysRoleService roleService;
}
复制代码

@Autowired se ensambla por tipo de manera predeterminada, y @Resource se ensambla por nombre de manera predeterminada. Cuando no se encuentra ningún bean que coincida con el nombre, se ensamblará por tipo.

Y @Qualifier se usa junto con Autowired para especificar el nombre del bean, y también se puede ensamblar por nombre.

Si usa @Autowired directamente en una variable en IDEA, encontrará una advertencia: Field injection is not recommended.

La razón es que se recomienda oficialmente que usemos el método de inyección del constructor, que tiene inconvenientes obvios, como: el objeto inyectado no se puede modificar con final y no se puede encontrar la existencia de NullPointException.

  1. Inyección de constructor
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;
    }
}
复制代码

La inyección de dependencia del constructor es implementada por el contenedor que activa el constructor de una clase, al forzar la inyección de dependencia especificada para garantizar el funcionamiento de la clase, evitando NullPointerException;

Spring recomienda oficialmente el uso de la inyección de constructor no solo porque las propiedades de los miembros se pueden modificar con la palabra clave final en este caso, sino que, lo que es más importante, puede evitar las dependencias circulares. Si hay dependencias circulares, se informará un error cuando se inicie el proyecto Spring. .

¿Por qué evitarlo en lugar de solucionarlo?

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

Tomemos una foto para ver si Spring puede resolver la dependencia circular cuando los dos métodos de inyección de objetos interdependientes de A y B son diferentes:

Inyección de constructor para resolver dependencias circulares:
1. Refactorización de código
2. Anotación @Lazy
3. Use inyección de propiedad en su lugar Visualización
sugerida : zhuanlan.zhihu.com

  1. Inyección de setter
public class SysUserController extends BaseController {
    
    private ISysUserService userService;

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

@AutowiredCabe señalar que debe agregar o @Resourceanotar al usar la inyección de Setter , de lo contrario, la inyección no tendrá éxito.

Otra cosa a tener en cuenta es que ni la inyección de propiedades ni las variables inyectadas por Setter se pueden finalmodificar con palabras clave.

@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)的方式,直接通过构造器的方式来完成注入,不仅能够省略简化许多代码,也解决了属性注入可能存在的空指针问题。

Supongo que te gusta

Origin juejin.im/post/7146035741234036744
Recomendado
Clasificación