Bean의 인스턴스화 방법

2025. 6. 11. 17:37Spring 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