DI 설정 방법
1. XML 기반
- xml 파일을 사용하여 <Bean>요소를 정의
- applicationContext.xml에 beans, c, context 네임스페이스 추가
1) 생성자 기반 의존성 주입(Constructor based dependency Injection)
- 생성자 인수를 통해 의존성 주입
- xml에 <constructor-arg>태그를 사용하여 컴포넌트 주입 설정
2) 설정자 기반 의존성 주입(Setter based dependency Injection)
- 메서드 인수를 통해 의존성 주입
- xml에 <property> 요소의 name 속성에 주입할 컴포넌트 이름 설정
<bean id="testDAO" class="com.tistory.yangsosolife.persistence.TestDAOImpl">
</bean>
<!-- Constructor based Injection -->
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
<constructor-arg ref="testDAO"/>
</bean>
<!-- Setter based Injection -->
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
<property name="testDAO" ref="testDAO"/>
</bean>
2. Annotation 기반
애너테이션을 클래스에 사용해서 DI컨테이너가 빈 자동 등록
- @Autowired
: 컨테이너가 빈과 다른 빈과의 의존성을 자동으로 주입
- @Component
: 컨테이너가 인젝션을 위한 빈을 설정
@Controller : 프레젠테이션 층 스프링 MVC용 애노테이션
@Service : 비즈니스 로직 층 Service용 애너테이션
@Repository : 데이터 액세스 층의 DAO용 애노테이션
@Configuration : JavaConfig용 애너테이션
- <context:annotation-config/>
: @Autowired, @Resource, @Required를 이용할 때 선언
xml에 이미 등록된 빈들의 애노테이션 기능을 적용해줌
예) DAO를 xml에 빈으로 등록해두고 Service에서 DAO를 사용하는 경우
<!-- ApplicationConetxt.xml -->
<bean id="testDAO" class="com.tistory.yangsosolife.persistence.TestDAOImpl">
</bean>
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
</bean>
<context:annotation-config />
//TestServiceImpl.java
public class TestServiceImpl implements TestService {
@Autowired
private TestDAO dao;
public void addTest(TestVO vo) throws Exception {
dao.add(vo);
}
}
- <context:component-scan base-package = "패키지명"/>
: @Component, @Service, @Repository, @Controller 등 이용할 때 선언
특정 패키지 내 클래스를 검색해서 자동으로 DI 컨테이너에 빈 등록
예) xml에 persistence와 service 패키지를 등록해두고 DAO와 Service에서 각각 @Component 선언
<!-- ApplicationContext.xml -->
<context:component-scan base-package="com.tistory.yangsosolife.persistence"></context:component-scan>
<context:component-scan base-package="com.tistory.yangsosolife.service"></context:component-scan>
//TestDAOImpl.java
@Component
public class TestDAOImpl implements TestDAO{
private Map<String,TestVO> map = new HashMap<String,TestVO>();
public void add(TestVO vo) throws Exception{
map.put(vo.getId(), vo);
}
}
//TestServiceImpl.java
@Component
public class TestServiceImpl implements TestService {
@Autowired
private TestDAO dao;
public void addTest(TestVO vo) throws Exception {
dao.add(vo);
}
}
3. Java 기반
- @Configuration 애너테이션을 자바 클래스에, @Bean 애너테이션을 매서드에 사용해서 빈 등록
- 자바 코드로 빈 설정
- TypeSafe, Refactoring하다는 장점
- @Configuration
: 빈 설정 메타 정보를 담고있는 클래스 선언
- @Bean
: 클래스 내의 매서드 정의하여 새로운 빈 객체 정의할 때 사용
//JavaConfig.java
@Configuration
public class JavaConfig{
@Bean
public TestDAO testDAO(){
return new TestDAOImpl();
}
@Bean
public TestService testService(){
return TestServiceImpl(testDAO());
}
}
<!-- applicationContext.xml -->
<bean id="testDAO" class="com.tistory.yangsosolife.persistence.TestDAOImpl">
</bean>
<bean id="testService" class="com.tistory.yangsosolife.service.TestServiceImpl">
<constructor-arg ref="testDAO"/>
</bean>
'개발일지 > SPRING' 카테고리의 다른 글
[Spring] Spring 핵심 개념, 모듈 (0) | 2023.10.22 |
---|---|
[JSP] JSP 내에서 노출 예약걸기 (0) | 2021.09.08 |
[Spring] Dependency Injection(DI) 개념 (0) | 2021.06.05 |
[Spring] 빌드 라이프사이클 (0) | 2021.04.26 |
[SPRING] Maven, pom 파일 이해하기 (0) | 2021.03.17 |