spring - AnnotationConfigApplicationContext getBean
Spring에서 Bean의 생성과 Bean들의 관계설정 같은 제어를 담당하는 IoC 오브젝트를 BeanFactory라고 한다.
보통 BeanFactory를 확장한 ApplicationContext를 사용하는데 ApplicationContext는 IoC방식을 따라 만들어진 일종의 BeanFactory라고 생각하면 된다.
BeanFactory의 종류 중 하나 AnnotationConfigApplicationContext
@Configure Annotation을 이용한 Java Code를 설정정보로 사용하려면 AnnotationConfigApplicationContext 를 이용한다.
public class DaoFactory {
public UserDAO userDAO() {
return new UserDAO(connectionMaker());
}
public ConnectionMaker connectionMaker() {
return new DConnectionMaker(); // DB 커넥션 오브젝트를 리턴해준다.
}
}
위와 같은 Factory Class가 있다.
이 Class를 설정정보로 이용하려면 아래와 같은 규칙을 따르면 된다.
- Class 선언 위에 @Configuration 이라는 Annotation을 추가한다.
- 객체(Bean)를 생성해 주는 메소드에는 @Bean이라는 Annotation을 추가한다.
package applicationcontext.factory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import applicationcontext.connectionmaker.ConnectionMaker;
import applicationcontext.connectionmaker.DConnectionMaker;
import applicationcontext.dao.UserDAO;
@Configuration
public class DaoFactory {
@Bean
public UserDAO userDAO() {
return new UserDAO(connectionMaker()); // Bean 생성
}
@Bean
public ConnectionMaker connectionMaker() {
return new DConnectionMaker(); // Bean 생성
}
}
이제 위 DaoFacory 클래스를 AnnotationConfigApplicationContext 클래스를 이용해 읽어들이고 UserDAO Bean을 가져오는 코드를 만들어 보겠다.
package applicationcontext.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import applicationcontext.dao.UserDAO;
import applicationcontext.factory.DaoFactory;
public class UserDAOTest {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDAO dao = context.getBean("userDAO", UserDAO.class);
System.out.println(dao.toString());
}
}
=====> applicationcontext.dao.UserDAO@d08633
context.getBean의 첫번째 파라미터 userDAO는 DaoFactory 클래스의 userDao라는 메소드의 이름이다.
두번째 파라미터 UserDAO.class는 userDAO라는 메소드에서 리턴해주는 class 이다.
실행해보면 정상적으로 Bean을 가져오는 것을 확인해 볼 수 있다.
스프링을 적용하긴 했지만 그냥 DaoFactory를 직접 사용한 것과 기능적으로 다를게 없다.
오히려 번거로운 준비작업과 코드가 필요하다.
그렇다면 굳이 스프링을 사용하지 않고 그냥 DaoFactory와 같은 오브젝트 팩토리를 만들어서 사용하면 되는게 아닐까?
(@Configure 없는 초기 버전의 Factory클래스 같은 클래스들을 오브젝트 팩토리라고 한다.)
스프링은 DaoFactory와 같은 오브젝트 팩토리만으로는 얻을 수 없는 많은 방법과 기능을 제공해 준다.
앞으로 이러한 것에 대해 공부해 볼 것이다.
출처 - http://babtingdev.tistory.com/288