ApplicationContext는 beanFactory를 포함하면서 더 많은 기능을 제공, IoC 컨테이너는 개념적인 내용인데, 스프링에서는 beanFactory!
ApplicationContext 객체로 beanFactory를 다룬다고 생각하면 됨!
// UserService.java
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired // 필드 주입
private UserRepository userRepository;
public void performService() {
userRepository.saveUser();
}
}
: 외부에서 수정이 불가능하므로 테스트 코드를 작성할 때 객체를 수정할 수 없다.
final 키워드를 통한 선언이 불가능해 객체의 불변성이 지켜지지 않는다.
// UserService.java
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private UserRepository userRepository; // nullable
@Autowired // 세터 주입
public void setUserRepository(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void performService() {
userRepository.saveUser();
}
}
: 외부에서 setter메서드로 임의로 변경할 수 있기 때문에 불변성이 지켜지지 않는다.
// UserService.java
package com.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired // 생성자 주입
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void performService() {
userRepository.saveUser();
}
}
: 객체 생성 시 1회만 호출되기 때문에 객체 불변성이 지켜짐 + 순환 참조 에러 방지
유일하게 final 키워드로 선언할 수 있어, 초기 클래스 생성 시 컴파일 단계로 잡아낼 수 있음
: 기본 유틸 및 추상화 담당