Spring에서 Bean을 생성하는 여러 가지 방법을 알아보겠습니다. 주요 방법은 다음과 같습니다:
- 기본 생성자를 사용한 인스턴스화
- 간단한 팩토리 패턴을 이용한 인스턴스화
- 팩토리 메서드 패턴을 이용한 인스턴스화
- FactoryBean 인터페이스를 사용한 인스턴스화
- 기본 생성자를 사용한 인스턴스화
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);
}
}
- 간단한 팩토리 패턴을 이용한 인스턴스화
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);
}
- 팩토리 메서드 패턴을 이용한 인스턴스화
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);
}
- FactoryBean 인터페이스를 사용한 인스턴스화
4.1 설명:
Spring에서 FactoryBean 인터페이스를 구현하면, 별도로 factory-bean과 factory-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);
}