스프링에서 DI를 사용하는 방법은 3가지이다.
1. 빈 설정 xml
2. 자바 코드를 이용
3. 애너테이션 이용
스프링 부트는 xml 사용을 최소화하기 때문에 2,3번 방법의 의존 주입을 많이 사용한다.
🛠️ 코드 Preview
1. 자바 코드를 이용하는 DI 방법
Printer 인터페이스를 구현한 2개의 구현체 PrinterA와 PrinterB가 있고, 일반 객체인 Book이 있다.
빈을 등록할 때 2개의 Book 클래스의 빈 이름을 다르게 설정한다.
/* Printer.java */
public interface Printer{
public void print(String message);
}
/* PrinterA.java */
public class PrinterA implements Printer{ // interface의 첫번째 구현체
@Override
public void print(String message) {
System.out.println("Printer A : " + message);
}
}
/* PrinterB.java */
public class PrinterB implements Printer{ // interface의 두번째 구현체
@Override
public void print(String message) {
System.out.println("Printer B : " + message);
}
}
/* Book.java */
public class Book {
private String title;
private String writer;
private Printer printer;
public Book() {}
public Book(String title, String writer, Printer printer){
this.title = title;
this.writer = writer;
this.printer = printer;
}
public void setTitle(String title) { this.title = title; }
public void setWriter(String writer) { this.writer = writer; }
public void setPrinter(Printer printer) { this.printer = printer; }
public void print(){
printer.print("Hello "+title+" : "+writer);
}
}
/* Config.java */
@Configuration // 스프링 설정으로 사용되는 클래스
public class Config {
@Bean // 메서드 단위에만 붙히는 애너테이션, 리턴값이 빈 객체로 사용됨을 알림
public Book book1(){
// 1. Setter 메서드를 이용한 의존성 주입
Book book1 = new Book();
book1.setTitle("해리포터");
book1.setWriter("J.K.롤링");
book1.setPrinter(new PrinterA());
return book1;
}
@Bean(name="hello") // 해당 클래스를 빈으로 등록할 때 이름을 지정할 수 있음
public Book book2(){
// 2. 생성자를 이용한 의존성 주입
return new Book("나니아연대기", "C.S.루이스", new PrinterA());
}
@Bean
public PrinterA printerA(){
return new PrinterA(); // 생성자를 이용한 의존성 주입
}
@Bean
public PrinterB printerB(){
return new PrinterB(); // 생성자를 이용한 의존성 주입
}
}
/* CodeApplication.java */
public class CodeApplication {
public static void main(String[] args){
// 1. IoC 컨테이너 생성
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
// 2. Book Bean 가져오기
Book book1 = (Book)context.getBean("book1");
book1.print(); // 출력 > Printer A : Hello 해리포터 : J.K.롤링
// 3. Book Bean 가져오기
Book book2 = context.getBean("hello", Book.class);
book2.print(); // 출력 > Printer A : Hello 나니아연대기 : C.S.루이스
// 4. PrinterB Bean 가져오기
Printer printer= context.getBean("printerB", Printer.class);
book1.setPrinter(printer);
book1.print(); // 출력 > Printer B : Hello 해리포터 : J.K.롤링
// 5.싱글톤인지 확인
if(book1 == book2)
System.out.println("동일한 객체");
else
System.out.println("서로 다른 객체");
// 출력 > 서로 다른 객체
}
}