롸?
Spring application - Annotation기반 DI 본문
1. 공통
- SenderInter.java
package pack;
public interface SenderInter {
void doSomething();
}
- Sender.java
package pack;
import org.springframework.stereotype.Component;
@Component
public class Sender implements SenderInter{
public void doSomething() {
System.out.println("doSomething을 수행");
}
}
- main.java
package pack;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("init.xml");
SenderProcess1 process1 = context.getBean("senderProcess1", SenderProcess1.class);
process1.show();
SenderProcess2 process2 = context.getBean("senderProcess2", SenderProcess2.class);
process2.show();
SenderProcess3 process3 = context.getBean("senderProcess3", SenderProcess3.class);
process3.show();
}
}
- init.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"
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.xsd">
<context:component-scan base-package="pack" />
</beans>
자동 주입과 함께 사용하는 추가 기능인 컴포넌트 스캔이다. 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록할 수 있으므로 컴포넌트 스캔 기능을 사용하면 설정 코드가 크게 줄어든다.
xml을 통해 스캔을 할 수도 있고 어노테이션을 사용해서 스캔을 할 수도 있다. 어노테이션으로 컴포넌트 스캔을 하려면 @Component로 스캔 대상을 표시하고 @ComponentScan(basePackages ={"패키지명"}) 으로 스캔할 패키지명을 지정해주면 된다.
2. Field Injection
package pack;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service
public class SenderProcess1 {
@Autowired
@Qualifier("sender")
private SenderInter inter;
public void show() {
System.out.println("Field Injection");
inter.doSomething();
}
}
3. Constructor Injection
package pack;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SenderProcess2 {
private SenderInter inter;
@Autowired
public SenderProcess2(SenderInter inter) {
this.inter = inter;
}
public void show() {
System.out.println("Constructor Injection");
inter.doSomething();
}
}
4. Setter Injection
package pack;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SenderProcess3 {
private SenderInter inter;
@Autowired
public void setInter(SenderInter inter) {
this.inter = inter;
}
public void show() {
System.out.println("Setter Injection");
inter.doSomething();
}
}
5. Annotation
@Component
- component-scan을 선언에 의해 특정 패키지 안의 클래스들을 스캔하고, @Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성한다.
@Controller, @Service, @Repository
- @Component 의 구체화 —> @Controller, @Service, @Repository
- 해당 클래스가 Controller/Service/Repository로 사용됨을 Spring Framework에 알린다.
@Autowired
- Type에 따라 Bean을 주입
@Qualifier
- 같은 타입의 빈이 두 개 이상 존재하는 경우에 스프링이 어떤 빈을 주입해야 할 지 알 수 없어서 스프링 컨테이너를 초기화 하는 과정에서 예외를 발생
- 때문에 @Autowired와 함께 쓰여서 어떤 Bean에 주입할지를 이름으로 지정
참고
1. https://gmlwjd9405.github.io/2018/12/02/spring-annotation-types.html
2. 책 - 초보 웹 개발자를 위한 스프링5 프로그래밍 입문
'Framework > Spring' 카테고리의 다른 글
Spring application - AOP 어노테이션 기반 간단예제 (0) | 2020.04.08 |
---|---|
스프링 MVC의 흐름 (0) | 2020.04.07 |
Spring application - xml기반 DI (0) | 2020.04.06 |
AOP (Aspect Oriented Programming) 용어 (0) | 2020.04.05 |
DI(Dependency Injection) 개념 (0) | 2020.04.03 |
Comments