Teknologian jakaminen

@RequiredArgsConstructor toteuttaa rakentajan lisäyksen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

@RequiredArgsConstructor toteuttaa rakentajan lisäyksen

1. @Autowired ja@Resource huomautus

@Autowired
  • @Autowired Se on Spring-kehyksen tarjoama huomautus, ja sitä käytetään riippuvuuksien automaattiseen kokoamiseen.
  • Voidaan käyttää kentissä, konstruktoreissa ja setterimenetelmissä.
@Autowired
private ISysUserService userService;
  • 1
  • 2
@Resource
  • @Resource Se on Java EE:n tarjoama huomautus, ja Spring tukee sitä myös riippuvuuksien automaattiseen kokoamiseen.
  • Käytetään yleensä kentille ja setter-menetelmille.
@Resource
private ISysUserService userService;
  • 1
  • 2

2. Rakentajan ruiskutus

Lombokin käyttö @RequiredArgsConstructor

Springbootin käsite ja käyttö @RequiredArgsConstructor-Tencent Cloud Developer Community-Tencent Cloud (tencent.com)

  • @RequiredArgsConstructor on Lombokin tarjoama huomautus, joka luo kaikki automaattisestifinal Kentän rakentaja.
  • Konstruktoriinjektion käyttäminen varmistaa, että riippuvuuslisäys on valmis, kun objekti luodaan, ja varmistaa, että kaikki riippuvuudet eivät ole tyhjiä.
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;
    
    // 构造函数由 Lombok 自动生成,注入所有 final 字段
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3. Vertailu ja edut

kenttäinjektio (@Autowired ja@Resource
  • etu: Koodi on ytimekäs ja merkitty suoraan kenttiin.
  • puute
    • Yksikkötestaus on vaikeaa, koska valeobjektit on ruiskutettava heijastuksen tai muun keinon avulla.
    • Riippuvuuden lisäys tapahtuu objektin luomisen jälkeen, mikä voi aiheuttaa riippuvuuksien epätäydellisen alustuksen.
    • Riippuvuuden inversion periaatetta rikkoen luokka riippuu suoraan säiliöstä.
rakentajan ruiskutus
  • etu
    • Pakota riippuvuudet olemaan täysin alustettu, kun objekti luodaan, ja varmista, että kaikki riippuvuudet eivät ole tyhjiä.
    • Helpompi yksikkötestaus, koska valeobjekteja voidaan ruiskuttaa konstruktorin kautta.
    • Se on enemmän riippuvuuden inversioperiaatteen mukainen ja tekee luokasta riippumattomamman säiliöstä.
    • Parannettu koodin luettavuus ja ylläpidettävyys, varsinkin kun on monia riippuvuuksia.
  • puute: Vaatii ylimääräisen konstruktorikoodin, mutta käyttää Lombokin koodia @RequiredArgsConstructor Tätä taakkaa voidaan keventää.

4. Esimerkkivertailu

käyttää @Autowired
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    
    @Autowired
    private ISysUserService userService;
    
    @Autowired
    private ISysRoleService roleService;
    
    @Autowired
    private ISysPostService postService;
    
    @Autowired
    private ISysDeptService deptService;
    
    @Autowired
    private ISysUserPostService userPostService;

    // 其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
Käytä konstruktoriinjektiota
@RequiredArgsConstructor
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 其他代码
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Tällä konstruktoriinjektiomenetelmällä ei vain voida parantaa koodin kestävyyttä ja ylläpidettävyyttä, vaan myös Springin riippuvuuslisäyksen ominaisuuksia ja Lombokin yksinkertaistetun koodin etuja voidaan hyödyntää paremmin.

hyötyä

Spring's Constructor Injection_spring Constructor Injection-CSDN-blogi
Lisää kuvan kuvaus

5. Tietoja huomautuksista

Konstruktoriinjektiota käytettäessä ei tarvitse lisätä ylimääräisiä huomautuksia, sinun tarvitsee vain antaa rakentaja. Kevät tunnistaa rakentajasi automaattisesti ja suorittaa riippuvuusruiskeen.

Käytä rakentajan lisäystä, lisämerkintöjä ei tarvita
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController {
    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 自己编写构造函数
    public SysUserController(ISysUserService userService, 
                             ISysRoleService roleService, 
                             ISysPostService postService, 
                             ISysDeptService deptService, 
                             ISysUserPostService userPostService) {
        this.userService = userService;
        this.roleService = roleService;
        this.postService = postService;
        this.deptService = deptService;
        this.userPostService = userPostService;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
Konstruktoriinjektion käytön pääkohdat
  1. Määrittele rakentaja:
    • Määritä luokassa konstruktori, joka sisältää kaikki vaaditut riippuvuudet.
  2. Jousen automaattinen ruiskutus:
    • Kun Spring luo Bean-esiintymän, se tunnistaa ja kutsuu rakentajan automaattisesti ja lisää tarvittavat riippuvuudet.

Esimerkkikoodi

package com.example.demo.controller;

import com.example.demo.service.ISysUserService;
import com.example.demo.service.ISysRoleService;
import com.example.demo.service.ISysPostService;
import com.example.demo.service.ISysDeptService;
import com.example.demo.service.ISysUserPostService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/system/user")
public class SysUserController {

    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 构造函数注入
    public SysUserController(ISysUserService userService, 
                             ISysRoleService roleService, 
                             ISysPostService postService, 
                             ISysDeptService deptService, 
                             ISysUserPostService userPostService) {
        this.userService = userService;
        this.roleService = roleService;
        this.postService = postService;
        this.deptService = deptService;
        this.userPostService = userPostService;
    }

    // 你的控制器方法
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

Tässä esimerkissä ei tarvitse käyttää ylimääräisiä huomautuksia konstruktorin merkitsemiseen, Spring tunnistaa ja lisää riippuvuuden automaattisesti. (Virhettä ei tietenkään ilmoiteta, jos se on merkitty, mutta vain @Autowired voidaan käyttää, eikä @Resoucea voida käyttää.@Resource Huomautuksia käytetään tyypillisesti kenttä- tai setterimenetelmän ruiskuttamiseen)

lisäolosuhteet
  1. Useita rakentajia:
    • Jos luokassa on useita konstruktoreita ja vain yhdellä niistä on lisäysparametrit, Spring käyttää tätä konstruktoria injektioon.
    • Jos on useita konstruktoreita, joilla on lisätyt parametrit, sinun on käytettävä @Autowired huomautus, joka määrittää selkeästi käytettävän rakentajan.

Esimerkkikoodi (useita rakentajia)

package com.example.demo.controller;

import com.example.demo.service.ISysUserService;
import com.example.demo.service.ISysRoleService;
import com.example.demo.service.ISysPostService;
import com.example.demo.service.ISysDeptService;
import com.example.demo.service.ISysUserPostService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/system/user")
public class SysUserController {

    private final ISysUserService userService;
    private final ISysRoleService roleService;
    private final ISysPostService postService;
    private final ISysDeptService deptService;
    private final ISysUserPostService userPostService;

    // 使用 @Autowired 明确指定使用哪个构造函数
    @Autowired
    public SysUserController(ISysUserService userService, 
                             ISysRoleService roleService, 
                             ISysPostService postService, 
                             ISysDeptService deptService, 
                             ISysUserPostService userPostService) {
        this.userService = userService;
        this.roleService = roleService;
        this.postService = postService;
        this.deptService = deptService;
        this.userPostService = userPostService;
    }

    // 另一个构造函数
    public SysUserController(ISysUserService userService) {
        this.userService = userService;
        this.roleService = null;
        this.postService = null;
        this.deptService = null;
        this.userPostService = null;
    }

    // 你的控制器方法
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

Tässä esimerkissä, koska konstruktoreita on useita, sinun on käytettävä @Autowired Huomautuksia, jotka määrittävät selkeästi, mitä konstruktoria Spring käyttää riippuvuuden lisäämiseen.