Anotation
- 메타데이터를 XML등의 문서에 설정하는 것이 아니라 소스코드에 @애노테이션의 형태로 표현
- 클래스, 메소드, 필드의 선언부에 표현
주요 Annotation
- @Autowired(@Inject)
- 컨테이너가 빈과 다른 빈과의 의존성을 자동으로 연결하도록 하는 수단
- 인스턴스 변수(빈) 앞에 @Autowired 붙여 해당 타입의 Component(빈)를 찾아 그 인스턴스(빈)를 주입
- <context:annotation-config/> 설정이 필요
- 단 <context:component-scan />가 설정되어 있으면 생략 가능하다.
- @Component(@Named)
- 컨테이너가 인젝션을 위한 인스턴스(빈)을 설정하는 수단
- 클래스 선언 앞에 @Component를 붙여 컨테이너가 찾아서 관리
- @Autowired가 붙은 인스턴스 변수에 주입
- <context:component-scan base-package=“패키지 이름"/> 선언은 @Component 애노테이션이 붙은 클래스를 자동으로 빈으로 등록하는 기능
빈 정의 파일의 주요 스키마 (ApplicationContext.xml)
스프링 주요 태그 - <context:annotation-config>
- @Autowired, @Resource, @Required
- xml 파일에 이미 등록된 빈들의 애노테이션 기능을 적용
- 빈을 등록하기 위한 검색 기능 X
- 태그 선언되었을 경우 생략 가능
- <mvc:annotation-driven />
- <context:component-scan />
스프링 주요 태그 - <context:component-scan base-package=“패키지명”/>
- @Component, @Service, @Repository, @Controller
- 특정 패키지 안에 클래스를 검색해 빈을 자동으로 찾아서 DI컨테이너에 등록
- <context:annotation-config /> 를 선언할 필요 X
@component 확장 애노테이션
- @Controller : 프레젠테이션 층 스프링 MVC용 애노테이션
- @Service : 비즈니스 로직 층 Service용 애노테이션
- @Repository : 데이터 액세스 층의 DAO용 애노테이션
- @Configuration : Bean 정의를 자바 프로그램에서 실행하는 JavaConfig용 애노테이션
di-annotation 예제
프로젝트 구성
프로젝트 만들기
<context:annotation-config /> 설정
- ApplicationContext.xml 설정
<bean id="memberDAO" class="org.tukorea.di.persistance.MemberDAOImpl">
</bean>
<bean id="memberService" class="org.tukorea.di.service.MemberServiceImpl">
</bean>
<context:annotation-config/>
package org.tukorea.di.persistence;
import java.util.HashMap;
import java.util.Map;
import org.tukorea.di.domain. StudentVO;
public class MemberDAOImpl implements MemberDAO {
private Map<String, StudentVO> storage = new HashMap<String, StudentVO>();
public StudentVO read(String id) throws Exception {
return storage.get(id);
}
public void add(StudentVO student) throws Exception {
storage.put(student.getId(), student);
}
}
package org.tukorea.di.service;
import org.tukorea.di.domain.MemberVO;
import org.tukorea.di.persistence.MemberDAO;
import org.springframework.beans.factory.annotation.Autowired;
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDAO memberDAO;
public StudentVO readMember(String id) throws Exception {
return memberDAO.read(id);
}
public void addMember(StudentVO student) throws Exception {
memberDAO.add(student);
}
}
<context:component-scan /> 설정
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="org.tukorea.di.persistence"></context:component-scan>
<context:component-scan base-package="org.tukorea.di.service"></context:component-scan>
</beans>
package org.tukorea.di.persistence;
import java.util.HashMap;
import java.util.Map;ㄴ
import org.tukorea.di.domain. StudentVO;
import org.springframework.stereotype.Component;
@Component
public class MemberDAOImpl implements MemberDAO {
private Map<String, StudentVO> storage = new HashMap<String, StudentVO>();
public StudentVO read(String id) throws Exception {
return storage.get(id);
}
public void add(StudentVO student) throws Exception {
storage.put(student.getId(), student);
}
}
package org.tukorea.di.service;
import org.tukorea.di.domain.MemberVO;
import org.tukorea.di.persistence.MemberDAO;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;
@Component
public class MemberServiceImpl implements MemberService {
@Autowired
private MemberDAO memberDAO;
public StudentVO readMember(String id) throws Exception {
return memberDAO.read(id);
}
public void addMember(StudentVO student) throws Exception {
memberDAO.add(student)
}
}