new로 생성하지 않아도, IOC 컨테이너가 객체(빈)를 만들고, 관리하며, 필요한 곳에 주입해주는 구조를 가짐@Component
public class MyComponent {
...
}
다음 어노테이션이 붙은 클래스는 자동으로 빈으로 등록됨:
@Component@Service: 서비스 계층에서 사용@Repository: 데이터 접근 계층에서 사용@Controller: 웹 컨트롤러 계층에서 사용내부적으로는 모두 @Component의 변형이지만, 역할을 구분하기 위해 사용함
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
보다 명시적으로 등록하고 싶을 경우 사용함
생성 → 의존성 주입 → 초기화 → 사용 → 소멸
빈의 특정 시점에 로직을 추가하고 싶을 땐 어노테이션을 사용함
@PostConstruct
public void init() {
System.out.println("초기화");
}
@PostConstruct: 빈 생성 후 초기화 작업@PreDestroy: 컨테이너 종료 시 정리 작업기본적으로 싱글톤(singleton)으로 관리되지만 스코프를 지정할 수 있음
@Scope("prototype")
@Component
public class MyPrototypeBean { ... }
singleton: 기본값. 애플리케이션 전체에서 1개 인스턴스 사용 prototype: 요청할 때마다 새로운 인스턴스 생성 request: HTTP 요청마다 1개 (웹 환경 전용) session: 세션마다 1개 (웹 환경 전용) @RequiredArgsConstructor // 생성자 주입을 자동으로 만들어주는 Lombok 어노테이션
@Component
public class OrderService {
private final ProductRepository productRepository;
}
| 주입 방식 | 설명 | 특징 |
|---|---|---|
| 생성자 주입 | 생성자를 통해 주입 | 가장 권장됨, 불변성, 테스트 용이 |
| 필드 주입 | 필드에 직접 주입 | 간편하지만 테스트/유지보수에 불리함 |
| Setter 주입 | Setter 메서드 통해 주입 | 선택적 의존성 처리 가능 |
@Autowired@Component
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
final 키워드 사용 가능 → 불변성 보장@Component
public class MemberService {
@Autowired
private MemberRepository memberRepository;
}
@Component
public class MemberService {
private MemberRepository memberRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}