Spring에서 Bean의 다양한 인스턴스화 방법

Spring에서 Bean을 생성하는 여러 가지 방법을 알아보겠습니다. 주요 방법은 다음과 같습니다:

  • 기본 생성자를 사용한 인스턴스화
  • 간단한 팩토리 패턴을 이용한 인스턴스화
  • 팩토리 메서드 패턴을 이용한 인스턴스화
  • FactoryBean 인터페이스를 사용한 인스턴스화
  1. 기본 생성자를 사용한 인스턴스화

1.1 설명:

Bean 객체를 생성하는 과정을 인스턴스화라고 합니다. 기본적으로 Bean의 파라미터 없는 생성자가 호출됩니다.

1.2 코드 예시:

a. 엔티티 클래스 정의:

package example.spring.bean;
public class User {
    public User() {
        System.out.println("User 클래스의 기본 생성자 실행.");
    }
}

b. XML 설정 파일:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="userBean" class="example.spring.bean.User"/>
</beans>

c. 테스트 코드:

package example.spring.test;
import example.spring.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringInstanceTest {
    @Test
    public void testConstructor() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        User user = context.getBean("userBean", User.class);
        System.out.println(user);
    }
}
  1. 간단한 팩토리 패턴을 이용한 인스턴스화

2.1 코드 예시:

1단계: Bean 정의:

package example.spring.bean;
public class Member {
}

2단계: 팩토리 클래스 정의:

package example.spring.bean;
public class MemberFactory {
    public static Member createMember() {
        return new Member();
    }
}

3단계: Spring 설정 파일 수정:

<bean id="memberBean" class="example.spring.bean.MemberFactory" factory-method="createMember"/>

2.2 테스트 코드:

@Test
public void testSimpleFactory() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    Member member = context.getBean("memberBean", Member.class);
    System.out.println(member);
}
  1. 팩토리 메서드 패턴을 이용한 인스턴스화

3.1 코드 예시:

1단계: Bean 정의:

package example.spring.bean;
public class PurchaseOrder {
}

2단계: 구체적인 팩토리 클래스 정의:

package example.spring.bean;
public class OrderFactory {
    public PurchaseOrder getOrder() {
        return new PurchaseOrder();
    }
}

3단계: Spring 설정 파일 수정:

<bean id="orderFactory" class="example.spring.bean.OrderFactory"/>
<bean id="orderBean" factory-bean="orderFactory" factory-method="getOrder"/>

3.2 테스트 코드:

@Test
public void testCustomFactoryBean() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    PurchaseOrder order = context.getBean("orderBean", PurchaseOrder.class);
    System.out.println(order);
}
  1. FactoryBean 인터페이스를 사용한 인스턴스화

4.1 설명:

Spring에서 FactoryBean 인터페이스를 구현하면, 별도로 factory-beanfactory-method를 지정할 필요가 없습니다.

4.2 코드 예시:

1단계: Bean 정의:

package example.spring.bean;
public class Customer {
}

2단계: FactoryBean 인터페이스 구현:

package example.spring.bean;
import org.springframework.beans.factory.FactoryBean;

public class CustomerFactoryBean implements FactoryBean<Customer> {

    @Override
    public Customer getObject() throws Exception {
        return new Customer();
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

3단계: Spring 설정 파일 수정:

<bean id="customerBean" class="example.spring.bean.CustomerFactoryBean"/>

4.3 테스트 코드:

@Test
public void testFactoryBeanMethod() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    Customer customer = context.getBean("customerBean", Customer.class);
    System.out.println(customer);

    Customer anotherCustomer = context.getBean("customerBean", Customer.class);
    System.out.println(anotherCustomer);
}

태그: Spring FactoryBean

6월 1일 20:46에 게시됨