4. setter주입, 생성자주입

sen·2023년 10월 20일

스프링프레임워크

목록 보기
3/7
post-thumbnail
  • 필드주입에서는 final을 사용할 수 없기 때문에, 다른곳에서 변형이 가능하다
  • 이는 안에있는 값이 바뀔 수 있는 단점이 있다.

setter주입

  • 필드주입과 같은데, 외부에서 직접 주입이 가능함
  • computer라는 객체가 필요할때 setComputer 메서드를 사용해서 주입하는 것
    • 똑같이 stackoveflow위험이 있고, final을 사용할 수 없다.
  • 잘 안씀
package com.example.ex00.dependency;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import lombok.Getter;

@Component
@Getter
public class Coding {
	
	private  Computer computer;

	//setter주입
	@Autowired
	public void setComputer(Computer computer) {
		this.computer = computer;
	}
}

생성자 주입

  • 메모리에 올리면서 주입을 받는다(필드와 setter은 올리고 나서 주입 받는다.)
  • 필드와 setter와 달리 순환참조 시 컴파일러가 인지가 가능해서 오류를 발생시킨다.
  • NullpointException을 통해서 순환참조를 막아줄 수 있다는 뜻(생성자를 사용하지 않고 객체의 필드를 초기화하지 않고 외부에서 해당 필드를 참조하면 NullPointerException이 발생)
  • 그렇기에 의존성 주입이 되지 않으면 객체가 생성되지 않는다
  • 메모리에 할당하면서 초기값으로 주입되므로 final키워드 사용가능, 다른곳에서 변형 불가능(안전하다)

생성자 주입 할때 초기화 할때 생성자를 만들어줘야하니까 @AllArgsConstructor 어노테이션을 사용한다

  • 안에 있는 모든 필드를 생성할 수 있는 생성자를 만드는 어노테이션이다
  • 많은 필드 중 골라서 주입 받고 싶다면 RequiredArgsConstructor을 사용한다
    • @NonNUll 을 붙여주거나 (절대로 null이 될 수 없다) final이 붙여져 있는 필드만 주입이 된다.
package com.example.ex00.dependency;

import org.springframework.stereotype.Component;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Component
@Getter
@AllArgsConstructor
//@RequiredArgsConstructor
public class Coding {
	
	

	private  final Computer computer; 
	
   // AllArgsConstructor를 사용하지 않으면 생성자를 직접 어노테이션 붙여야한다.
//	@Autowired
//	public Coding(Computer computer) {
//		super();
//		this.computer = computer;
//	}
	
	}
}
profile
가보자고~!

0개의 댓글