개발 무지렁이

[Spring] 생성과 주입의 annotation, & 활성화 본문

Backend/스프링

[Spring] 생성과 주입의 annotation, & 활성화

Gaejirang-e 2023. 4. 30. 19:17

생성 annotation


  @Component: <bean>태그와 동일한 역할을 한다. 객체 생성
  이를 확장해놓은,
  @Repository: persistence(영속성)을 가지는 클래스 생성
  @Service: business logic을 가지는 클래스 생성
  @Controller: presentation layer, 웹 요청과 응답을 처리하는 클래스 생성

  🚨. annotation의 기본 id는 클래스 이름의 '첫글자'만 '소문자', 나머지는 동일

주입 annotation


  @Autowired: <constructor-arg />, <property />을 byType으로 주입
                같은 타입이 여러개 있다면 byName으로 주입
  @Resource: 의존하는 객체를 자동으로 주입, 주로 byName으로 주입
  @Value: <property />와 동일한 역할을 한다.
  @Qualifier: 동일한 타입의 bean객체가 여러개 존재할 때, 특정 bean을 찾기 위해서 id 설정

  ⚠️ @Scope("prototype") // 지연초기화 (필요할 때마다 새로운 객체 생성)
📌. bean등록 annotation in xml

⚠️ context: 필요로하는 객체들을 미리 생성
<context:component-scan base-package=" " /> // 하위를 포함, 여러개일 땐 콤마(,)로 구분
@Component를 통해 자동으로 bean 등록
(+ annotation마다 활성화하는 전용클래스가 따로 있다, 만들어서 등록이 필요하다)

하나하나 bean을 만들어서 등록하지 말고, 몰아서 한번에 등록
<context:annotation-config /> // spring 내부에서 알아서 등록
(@Component, @Repository, @Service, @Controller, @RestController, @ControllerAdvice
and @Configuration +
@Required, @Autowired, @Resource, ...
  @Controller
  public class EmpController {
      @Autowired // byType으로 주입
      @Qualifier("emp2")
      private EmpDTO empDTO; // injection

    @Autowired
      private EmpDTO emp;

      @Autowired
      private EmpService service;

      public EmpController() {
          System.out.println("EmpController constructor call");
      }

      public void test() {
          System.out.println("empDTO: " + empDTO + ", empno: " + empDTO.getEmpno());
          System.out.println("emp: " + emp + ", empno: " + emp.getEmpno());
          System.out.println("service: " + service);

          service.test();
      }
  }

@RequiredArgsConstructor


final or @NotNull을 선언한 필드(값변경불가, 초기화필수)를 기반으로 생성자를 추가
lombok에서 생성자를 통한 주입

⚠️. @Autowired를 안쓴다.
Comments