기술나눔

@RequiredArgsConstructor는 생성자 주입을 구현합니다.

2024-07-12

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

@RequiredArgsConstructor는 생성자 주입을 구현합니다.

1. @Autowired 그리고@Resource 주석

@Autowired
  • @Autowired Spring 프레임워크에서 제공하는 주석으로 종속성을 자동으로 어셈블하는 데 사용됩니다.
  • 필드, 생성자 및 setter 메서드에서 사용할 수 있습니다.
@Autowired
private ISysUserService userService;
  • 1
  • 2
@Resource
  • @Resource Java EE에서 제공하는 Annotation으로 Spring에서도 의존성 자동 어셈블리를 지원한다.
  • 일반적으로 필드 및 setter 메소드에 사용됩니다.
@Resource
private ISysUserService userService;
  • 1
  • 2

2. 생성자 주입

롬복 사용 @RequiredArgsConstructor

springboot의 개념 및 사용 @RequiredArgsConstructor-Tencent Cloud 개발자 커뮤니티-Tencent Cloud(tencent.com)

  • @RequiredArgsConstructor Lombok에서 제공하는 주석으로, 모든 항목을 자동으로 생성합니다.final 필드 생성자.
  • 생성자 주입을 사용하면 개체가 생성될 때 종속성 주입이 완료되어 모든 종속성이 null이 아닌지 확인합니다.
@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
  • 이점: 코드는 간결하며 필드에 직접 주석이 추가됩니다.
  • 결점
    • 모의 개체는 반사나 다른 수단을 통해 주입해야 하기 때문에 단위 테스트가 어렵습니다.
    • 종속성 주입은 개체가 생성된 후에 발생하므로 종속성이 불완전하게 초기화될 수 있습니다.
    • 종속성 반전 원칙을 위반하여 클래스는 컨테이너에 직접 종속됩니다.
생성자 주입
  • 이점
    • 개체가 생성될 때 종속성이 완전히 초기화되도록 강제하여 모든 종속성이 null이 아닌지 확인합니다.
    • 생성자를 통해 모의 객체를 주입할 수 있으므로 단위 테스트가 더 쉽습니다.
    • 이는 종속성 반전 원칙에 더 부합하며 클래스를 컨테이너로부터 더욱 독립적으로 만듭니다.
    • 특히 종속성이 많은 경우 코드 가독성과 유지 관리성이 향상되었습니다.
  • 결점: 추가 생성자 코드가 필요하지만 Lombok의 코드를 사용합니다. @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의 생성자 주입_spring 생성자 주입-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이 종속성 주입에 사용하는 생성자를 명시적으로 지정하는 주석입니다.