2025. 6. 11. 17:37ㆍSpring Framework/Spring IoC
Spring에서 "Bean을 인스턴스화 하는 방법", 즉 Bean 객체를 어떻게 생성하고 관리하는지에 대한 방법이다.
Spring은 Bean을 생성할 때 여러 가지 방식으로 객체를 인스턴스화할 수 있다.
대표적으로 :
| 방법 | 설명 |
| 디폴트 생성자 사용 | 클래스의 생성자를 호출해 인스턴스를 만듦 |
| 정적 팩토리 메서드 | static 메서드를 호출해 객체를 생성 |
| 인스턴스 팩토리 메서드 | 객체의 메서드를 호출해 생성 |
1️⃣ 디폴트 생성자 사용
Spring이 클래스의 생성자를 호출해서 객체(Bean)를 만드는 방식이다.
가장 기본적이며, 대부분의 Bean은 이 방식으로 생성된다.
📃 예제
config 패키지
@Configuration
@ComponentScan(basePackages ="package defaultconstructor.service")
public class AppConfig {
@Bean
public MyService myService() {
return new MyService(); // 생성자 직접 호출
}
}
service 패키지
public class MyService {
public MyService() {
System.out.println("MyService의 디폴트 생성자!!");
}
}
@Component
public class UserService {
// 디폴트 생성자는 생성자가 없을 경우 컴파일러가 자동으로 생성해줌
public UserService() {
System.out.println("UserService의 디폴트 생성자!!");
}
}
Main 클래스
public class Main {
public static void main(String... args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
}
}
호출시
UserService의 디폴트 생성자!!
MyService의 디폴트 생성자!!
2️⃣ 정적 팩토리 메서드 방식
클래스의 static 메서드를 이용해 객체를 생성하는 방식이다
Spring에서 이 메서드를 호출해 Bean으로 등록할 수 있다.
복잡한 생성 로직이 있는경우, 외부 라이브러리 객체를 Spring에서 등록할 때, 생성자 대신 메서드를 통해 객체 생성을 제어하고 싶을 때 사용된다.
📃 예제
config 패키지
@Configuration
public class AppConfig {
@Bean
public StaticService staticService() {
return StaticService.service(); // 정적 팩토리 메서드 호출
}
}
service 패키지
public class StaticService {
// private 설정 이유
// 직접 생성 못하게 막고, 정적 팩토리 메서드로만 인스턴스 생성하게 하기 위함
private StaticService() {
System.out.println("(private)디폴트 생성자 호출");
}
public static StaticService service() {
System.out.println("정적 팩토리 메서드");
return new StaticService();
}
}
Main 클래스
public class Main {
public static void main(String... args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
}
}
호출시
정적 팩토리 메서드
(private)디폴트 생성자 호출
이 경우 service()는 같은 클래스 내부의 static 메서드 이므로, private 생성자 접근이 가능하다.
Spring은 이 static 메서드만 호출하므로 생성자의 접근 제어자와는 무관하다.
3️⃣ 인스턴스 팩토리 메서드 방식
인스턴스 팩토리 메서드를 이용한 인스턴스화는
컨테이너에 등록된 기존 빈의 인스턴스 메서드를 호출하여 새로운 빈을 생성하는 방식이다.
이 방식을 사용하려면:
- class 속성은 비워두고
- factory-bean 속성에 해당 인스턴스 메서드를 포함한 Bean의 이름을 지정한다
(이 Bean은 현재 컨테이너 혹은 부모 또는 조상 컨테이너에 존재할 수 있다.) - factory-method 속성에는 호출할 팩토리 메서드의 이름을 지정한다
📃 예제
config 패키지
@Configuration
public class AppConfig {
// 1단계 : CarFactory Bean 먼저 생성
@Bean
public CarFactory carFactory() {
return new CarFactory();
}
// 2단계 : CarFactory 인스턴스의 메서드 호출 -> Car 생성
@Bean
public Car car() {
return carFactory().createCar(); // 인스턴스 팩토리 메서드
}
}
model 패키지
public class Car {
private String brand;
private String model;
public Car(String brand, String model) {
this.brand = brand;
this.model = model;
}
public void status() {
System.out.println(brand + "의 " + model);
}
}
public class CarFactory {
public CarFactory() {
System.out.println("CarFactory 기본 생성자");
}
public Car createCar() {
System.out.println("createCar() 호출");
return new Car("현대", "산타페");
}
}
Main 클래스
public class Main {
public static void main(String... args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.status();
}
}
호출시
CarFactory 기본 생성자
createCar() 호출
현대의 산타페'Spring Framework > Spring IoC' 카테고리의 다른 글
| DI에서 Depend on, Lazy, Autowiring 사용 (0) | 2025.06.18 |
|---|---|
| Dependency Injection(DI, 의존성 주입) (0) | 2025.06.18 |
| Bean 이름 지정 (Naming Beans) (0) | 2025.06.11 |
| Bean Definition(정의) (0) | 2025.06.11 |
| Spring IoC Container (1) | 2025.06.11 |