Κοινή χρήση τεχνολογίας

Το @RequiredArgsConstructor υλοποιεί την ένεση κατασκευαστή

2024-07-12

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

Το @RequiredArgsConstructor υλοποιεί την ένεση κατασκευαστή

1. @Autowired και@Resource σχόλιο

@Autowired
  • @Autowired Είναι ένας σχολιασμός που παρέχεται από το πλαίσιο Spring και χρησιμοποιείται για την αυτόματη συγκέντρωση εξαρτήσεων.
  • Μπορεί να χρησιμοποιηθεί σε πεδία, κατασκευαστές και μεθόδους ρυθμιστή.
@Autowired
private ISysUserService userService;
  • 1
  • 2
@Resource
  • @Resource Είναι ένας σχολιασμός που παρέχεται από την Java EE και το Spring το υποστηρίζει επίσης για αυτόματη συναρμολόγηση εξαρτήσεων.
  • Γενικά χρησιμοποιείται για πεδία και μεθόδους ρυθμιστή.
@Resource
private ISysUserService userService;
  • 1
  • 2

2. Έγχυση κατασκευαστή

Χρησιμοποιώντας Lombok @RequiredArgsConstructor

Η ιδέα και η χρήση του Springboot @RequiredArgsConstructor-Tencent Cloud Developer Community-Tencent Cloud (tencent.com)

  • @RequiredArgsConstructor είναι ένας σχολιασμός που παρέχεται από τη Lombok, ο οποίος θα δημιουργήσει αυτόματα όλαfinal Κατασκευαστής πεδίου.
  • Η χρήση της ένεσης κατασκευαστή διασφαλίζει ότι η ένεση εξάρτησης ολοκληρώνεται όταν δημιουργείται το αντικείμενο, διασφαλίζοντας ότι όλες οι εξαρτήσεις δεν είναι μηδενικές.
@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. Σύγκριση και Πλεονεκτήματα

ένεση πεδίου (@Autowired και@Resource
  • πλεονέκτημα: Ο κώδικας είναι συνοπτικός και σημειώνεται απευθείας στα πεδία.
  • έλλειψη
    • Δύσκολη η δοκιμή μονάδας επειδή τα εικονικά αντικείμενα πρέπει να εγχυθούν μέσω ανάκλασης ή άλλων μέσων.
    • Η ένεση εξάρτησης πραγματοποιείται μετά τη δημιουργία του αντικειμένου, γεγονός που μπορεί να προκαλέσει την ατελή προετοιμασία των εξαρτήσεων.
    • Παραβιάζοντας την αρχή της αντιστροφής της εξάρτησης, η κλάση εξαρτάται άμεσα από το κοντέινερ.
έγχυση κατασκευαστή
  • πλεονέκτημα
    • Αναγκάστε τις εξαρτήσεις να αρχικοποιηθούν πλήρως όταν δημιουργείται το αντικείμενο, διασφαλίζοντας ότι όλες οι εξαρτήσεις δεν είναι μηδενικές.
    • Πιο εύκολο στη δοκιμή μονάδας, καθώς τα εικονικά αντικείμενα μπορούν να εγχυθούν μέσω του κατασκευαστή.
    • Συνάδει περισσότερο με την αρχή της αντιστροφής της εξάρτησης και κάνει την κλάση πιο ανεξάρτητη από το κοντέινερ.
    • Βελτιωμένη αναγνωσιμότητα και δυνατότητα συντήρησης κώδικα, ειδικά όταν υπάρχουν πολλές εξαρτήσεις.
  • έλλειψη: Απαιτεί πρόσθετο κώδικα κατασκευής, αλλά χρησιμοποιεί Lombok's @RequiredArgsConstructor Αυτό το βάρος μπορεί να ελαφρυνθεί.

4. Παράδειγμα σύγκρισης

χρήση @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
Χρήση δομικής έγχυσης
@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

Μέσω αυτής της μεθόδου έγχυσης κατασκευαστή, όχι μόνο μπορεί να βελτιωθεί η στιβαρότητα και η δυνατότητα συντήρησης του κώδικα, αλλά και τα χαρακτηριστικά έγχυσης εξάρτησης του Spring και τα πλεονεκτήματα του απλοποιημένου κώδικα του Lombok μπορούν να χρησιμοποιηθούν καλύτερα.

όφελος

Ιστολόγιο Spring's Constructor Injection_spring Constructor Injection-CSDN
Προσθέστε περιγραφή εικόνας

5. Περί σχολιασμών

Όταν χρησιμοποιείτε την ένεση κατασκευαστή, δεν χρειάζεται να προσθέσετε πρόσθετους σχολιασμούς, χρειάζεται μόνο να παρέχετε τον κατασκευαστή. Το Spring θα εντοπίσει αυτόματα τον κατασκευαστή σας και θα πραγματοποιήσει ένεση εξάρτησης.

Χρησιμοποιήστε την έγχυση κατασκευαστή, δεν απαιτούνται πρόσθετοι σχολιασμοί
@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
Βασικά σημεία χρήσης της έγχυσης κατασκευαστή
  1. Ορίστε τον κατασκευαστή:
    • Ορίστε έναν κατασκευαστή στην κλάση που περιέχει όλες τις απαιτούμενες εξαρτήσεις.
  2. Αυτόματος ψεκασμός ελατηρίου:
    • Όταν το Spring δημιουργεί μια παρουσία Bean, αναγνωρίζει αυτόματα και καλεί τον κατασκευαστή και εισάγει τις απαιτούμενες εξαρτήσεις.

Δείγμα κώδικα

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

Σε αυτό το παράδειγμα, δεν χρειάζεται να χρησιμοποιήσετε πρόσθετους σχολιασμούς για τον σχολιασμό του κατασκευαστή, το Spring θα αναγνωρίσει και θα εισαγάγει αυτόματα την εξάρτηση. (Φυσικά, δεν θα αναφερθεί κανένα σφάλμα εάν επισημανθεί, αλλά μόνο το @Autowired μπορεί να χρησιμοποιηθεί και το @Resouce δεν μπορεί να χρησιμοποιηθεί.@Resource Οι σχολιασμοί χρησιμοποιούνται συνήθως για την έγχυση μεθόδου πεδίου ή ρυθμιστή)

πρόσθετες περιστάσεις
  1. Πολλαπλοί κατασκευαστές:
    • Εάν υπάρχουν πολλοί κατασκευαστές σε μια κλάση και μόνο ένας από αυτούς έχει παραμέτρους έγχυσης, το Spring θα χρησιμοποιήσει αυτόν τον κατασκευαστή για έγχυση.
    • Εάν υπάρχουν πολλοί κατασκευαστές με ένεση παραμέτρων, πρέπει να χρησιμοποιήσετε @Autowired σχολιασμός για να προσδιορίσετε ρητά τον κατασκευαστή που θα χρησιμοποιηθεί.

Δείγμα κώδικα (πολλαπλοί κατασκευαστές)

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

Σε αυτό το παράδειγμα, δεδομένου ότι υπάρχουν πολλοί κατασκευαστές, πρέπει να χρησιμοποιήσετε @Autowired Σχολιασμοί για να προσδιορίσετε ρητά τον κατασκευαστή Spring που χρησιμοποιεί για την ένεση εξάρτησης.