DI를 사용하기 위해서는 객체 생성이 우선 되어야 했다. 이때 Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해준다.
Spring Bean: Spring이 관리하는 객체
Spring IoC 컨테이너: Bean을 모아둔 컨테이너
'Bean'으로 등록하고자하는 클래스 위에 설정
@Component
public class MemoService { ... }
Spring 서버가 뜰 때 IoC 컨테이너에 'Bean'을 저장 해줌
@Component
가 설정된 클래스에 대해서 Spring이 해 주는 일// 1. MemoService 객체 생성
MemoService memoService = new MemoService();
// 2. Spring IoC 컨테이너에 Bean (memoService) 저장
// memoService -> Spring IoC 컨테이너
@Component
가 설정된 클래스들을 ‘Bean’으로 등록 해줌@Configuration
@ComponentScan(basePackages = "com.sparta.memo")
class BeanConfig { ... }
Spring IoC 컨테이너에 의해 관리되는 클래스에서만 가능
@Autowired
@Component
public class MemoService {
@Autowired
private MemoRepository memoRepository;
...
}
@Autowired
@Component
public class MemoService {
private final MemoRepository memoRepository;
@Autowired
public MemoService(MemoRepository memoRepository) {
this.memoRepository = memoRepository;
}
...
}
👍🏻 @Autowired 생략 조건
- Spring 4.3부터 @Autowired 생략가능
- 단, 생성자 선언이 1개일 때만
public class A { public A(B b) { ... } }
- Lombok의
@RequiredArgsConstructor
사용@Component @RequiredArgsConstructor // final로 선언된 멤버 변수를 파라미터로 사용하여 생성자를 자동으로 생성 public class MemoService { private final MemoRepository memoRepository; ... }
@Component
public class MemoService {
private final MemoRepository memoRepository;
public MemoService(ApplicationContext context) {
// 1.'Bean' 이름으로 가져오기
MemoRepository memoRepository = (MemoRepository) context.getBean("memoRepository");
// 2.'Bean' 클래스 형식으로 가져오기
// MemoRepository memoRepository = context.getBean(MemoRepository.class);
this.memoRepository = memoRepository;
}
...
}
Spring 3 Layer Annotation은 Controller, Service, Repository의 역할로 구분된 클래스들을 ‘Bean’으로 등록할 때 해당 ‘Bean’ 클래스의 역할을 명시하기위해 사용됨
@Component
대신 다음 annotation을 사용할 수 있음@Controller
, @RestController
@Service
@Repository