Annotation 기반 Bean 설정
- Annotation의 사용으로 설정파일을 간결화하고 객체 또는 메소드의 맵핑을 명확하게 할 수 있다.
- Java code로 설정을 하기 때문에 type safe하며, Spring이 빠르게 container를 설정하게 한다.
- Annotation이 클래스 (또는 메소드) 상단에 추가되면서 설정이 구성되기 때문에 클래스 파일만 보아도 어떤 스프링 설정이 적용된 클래스인지 한눈에 알 수 있다.
- 설정이 변경될 경우 Application code 클래스 파일까지 수정해 주어야 한다.
- 애노테이션을 이용한 의존성 주입 Field Injection, Setter Injection, Constructor Injection
애노테이션을 이용한 이용한 의존성 주입(Dependency Injection)
1) Field Injection
- 필드를 통한 의존성 주입
- 사용 예
public class Sample {
@Autowired
private Example example;
}
2) Setter Injection(수정한 주입)
- setter 메소드를 통한 의존성 주입
- 사용 예
public class Sample {
private Example example;
@Autowired
public void setExample(Example example) {
this.example = example;
}
}
3) Constructor Injection(생성자 주입)
- 생성자를 통한 의존성 주입
- 권장 방식
- 사용 예
public class Sample {
private Example example;
@Autowired
public Sample(Example example) {
this.example = example;
}
}
<context:annotation-config/>
- 애노테이션(Annotation)은 기본적으로 활성화되지 않기 때문에 xml에 명시적인 활성화 작업이 필요하다.
- Application Context 안에 이미 등록된 bean들의 Annotation을 활성화 하기 위해 사용 한다.
즉, 스프링 컨텍스트에 의해 생성되어 저장된 bean들에 대해서 @Autowired와 @Qualifier 등의 Annotation 을 인식할 수 있다.
- <context:component-scan> 은 Bean을 등록하고 @Autowired와 @Qualifier 등의 Annotation을 활성화 할 수 있지만 <context:annotation-config/>는 Bean을 등록하지는 못한다.
- <context:annotation-config/> 로 활성화 할 수 있는 Annotation
@Autowired, @Qualifier, @Resource, @PostConstruct, @PreDestroy 등
의존성 주입 애노테이션
1) @Autowired
- @Autowired는 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입한다.
- @Autowired는 필드, 생성자, Setter 메소드, 일반 메소드에 붙일 수 있다.
- 필드에 붙이면 Setter를 통해 주입되며, Setter가 없으면 컴파일 과정에서 자동으로 추가된다.
- @Autowired를 필드, Setter 메소드에 붙여서 사용할 경우 반드시 기존 생성자가 정의되어 있어야 한다.
2) @Qualifier
- 동일한 타입한 타입의 빈 객체가 여러 개 정의되어 있는 경우 특정 빈을 주입할 수 있도록 설정한다.
@Qualifier는 <bean> 태그 하위에 <qualifier> 태그를 설정하여 특정 빈을 삽입할 수 있게 설정한다.
- @Autowired 애노테이션이 적용된 주입 대상에 @Qualifier 애노테이션을 설정한다.
@Qualifier는 단독으로 사용할 수 없으며 @Autowired애노테이션과 함께 사용한다.
- 형식
@Autowired
@Qualifier("beanName")
3) @Resource
- @Resource는 주입하려고 하는 객체의 이름<id>이 일치하는 객체를 자동으로 주입한다.
- @Resource는 Java제공 애노테이션이며 필드, 입력 파라미터가 하나인 Setter 메소드에 붙일 수 있다. 생성자에는 붙일 수 없다.
- 필드에 직접 정의하는 경우 Setter를 정의하지 않아도 된다.
- @Autowired와 마찬가지 반드시 기본 생성자가 정의되어 있어야 한다.
- 형식
name 속성을 지정하지 않은 경우 : 필드명과 동일한 이름의 빈을 주입한다.
@Resource
name 속성을 지정한 경우 : name 속성의 빈 이름과 동일한 빈을 주입한다.
@Resource(name="beanName")
4) @Inject
- @Inject는 @Autowired와 유사하며, 주입하려고 하는 객체의 타입이 일치한 객체를 자동으로 주입한다.
- @Inject는 Java 제공 애노테이션이며 필드, 생성자, Setter에 붙일 수 있다.
- @Inject를 사용하기 위해서는 javax.inject의존성을 추가한다.
5) @Named
- @Autowired의 @Qualifier와 같이 사용할 수 있는 것이 @Inject에서는 @Named 이다.
- @Named에 빈 이름(id)를 지정한다.
- 형식
@Named("beanName")
기타 의존성주입 관련 애노테이션
1) @Required
- setter에 붙여 반드시 주입 해야하는 프로퍼티로 설정하는 애노테이션
- Spring 5.1 버전부터 Deprecated 되었다. 반드시 주입해야 할 프로퍼티는 생성자 주입을 이용한다.
- 스프링 5.1이상을 사용하거나 자바 파일 bean을 등록했을 경우 무시된다.
2) @Value
- 기본 자료형과 문자열의 값을 필드에 주입하기 위해 사용되며, 필드나 생성자와 메소드는 매개 변수 수준에서 적용할 수 있다.
- 생성자 주입 시 자동으로 주입되지 않는 기본 자료형과 문자열의 값을 설정한다.
- 사용 예 : 생성자
public class Sample {
private int num;
@Autowired
public Sample(@Value("10") int num) {
this.num = num;
}
}
<context:component-scan/>태그
1) 개요
- Component Scan을 지원하는 태그
- Bean이 될 수 있는 모든 Componenet를 자동으로 찾아 Bean Container에 등록한다.
- 설정 과정을 XML로 선언하는 방식보다 이해하기 쉽고 직관적이다.
@Component, @Repository, @Service, @Controller를 선언하고자 하는 Java 코드에 용도에 맞게 직관적으로 선언을 하기 때문에 알아보기 쉽고, 코드를 이해하기도 편하다.
- <context:component-scan>을 이용하게 되면 <context:annotation-config>의 사용이 불필요하다. 즉, @Autowired, @Qualifier, @Resource 같은 애노테이션도 활성화되므로 사용이 불필요하다.
'쌍용강북교육센터 > 11월' 카테고리의 다른 글
1117_Spring : MVC 웹 애플리케이션 (1) (0) | 2021.11.21 |
---|---|
1117_Spring : Spring Web MVC(Model View Controller) (0) | 2021.11.21 |
1116_Spring : IoC(Inversion Of Control) 컨테이너 (0) | 2021.11.17 |
1116_Spring : Framework 프레임워크 (0) | 2021.11.17 |
1115_세미프로젝트 : Garment Market (0) | 2021.11.16 |