롸?

Spring application - Annotation기반 DI 본문

Framework/Spring

Spring application - Annotation기반 DI

허니버터새우깡 2020. 4. 6. 17:31

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 프로그래밍 입문

Comments