@Autowired 어노테이션 이용하여 의존성 주입할 수 있다.
가장 간단해요 !
필드에 @Autowired 를 붙여서 의존성 주입한다
그렇지만 ..
final 을 붙일 수 없어요 .😥 ....->변경될 여지가 있음.
setter(메소드)에 @Autowired 를 붙여서 클래스 타입의 빈을 찾아와서 의존성을 주입한다.
생성 시점 이후 메소드를 호출하여 의존성 변경 가능 .
그러나 필드가 외부에서 변경될 수 있다는 점 ,
의존성이 필요한 시점에 주입되지 않을 수도 있음
클래스 생성자에 @Autowired 를 붙여 클래스 타입의 필드들을 찾아서 등록.
선언하는 클래스에 final 붙이기 가능
스프링에서 가장 권장되는 주입방식
장점 !
직접 테스트를 하러 가보장 ..!😀
DTest1.java
import org.springframework.stereotype.Component;
@Component
public class DTest1{
public void print(){
System.out.println("DTest1임 ");
}
}
DTest2.java
package~..
import org.springframework.stereotype.Component;
@Component
public class DTest2{
//필드
private final DTest1 dTest1;
//생성자
//생성자를 통해 DTest1객체를 dTest1 필드에 할당한다
public DTest2(DTest1 dTest1){
this.dTest1 = dTest1;
}
//메서드
//dTest1 의 print() 메서드 호출 후 출력한다
public void print2(){
dTest1.print();
System.out.println("DTest2");
}
}
※ @Component 어노테이션
DTest1, DTest2 클래스에 붙어 있죠 ? 이를 통해 이 클래스들은 Spring 컨테이너에 의해 관리되는 빈으로 등록된다.
Spring 애플리케이션이 시작될때 @Component 가 붙은 클래스들은 자동으로 인스턴스화되고 컨테이너에 등록된다 이말 ..!
※ 의존성 주입
DTest2 클래스가 DTest1 클래스를 의존성으로 가지고 있는 상황
DTest2 생성자는 DTest1 타입의 매개변수를 받는다 .. Spring은 이 생성자를 호출하여 DTest1 빈을 DTest2 빈에 주입하는데? 이를 생성자 주입이라 한다
※참고
class DTest2⬇️{ .. -> ⬇️ 여기서 alt+enter 누르면 바로 Test 만들 수 있다_
DTest1Test.java
package com.~~
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DTest1Test{
//필드 주입
@Autowired
private DTest1 dTest1;
@Test
void print(){
//여기 두 줄은 그냥 순수 자바.
DTest1 test1 = new DTest1();
test1.print();
dTest1.print();
}
}
DTest1Test.java
package com.~~
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DTest1Test{
//setter 주입
public void setDTest1(DTest1 dTest1){
this.dTest1 = dTest1;
}
@Test
void print(){
dTest1.print();
}
}
DTest1Test.java
package com.~~
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DTest1Test{
//생성자 주입
private final DTest1 dTest1;
@Autowired
public DTest1Test(DTest1 dTest1){
this.dTest1 = dTest1;
}
@Test
void print(){
dTest1.print();
}
}
이건 DTest2Test.java ..그니까 아까 클래스 보면 DTest1, DTEst2 둘 다 콘솔창에 출력되어야 해야겠 죠 ?
DTest2Test.java
package com.~
import org.junit.jupiter.api.Test;
iport org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
class DTest2Test{
@Autowired
private DTest2 dTest2;
@Test
void test(){
dTest2.print2();
}
}
출력
DTest1
DTest2