빈과 일반 객체의 차이는 !
ApplicationContext 에서 가져오는지 아닌지
즉, ApplicationContext가 만들어서 그 안에 담고 있는 객체를 빈(Bean) 이라고 할 수 있음
1. 빈으로 등록하는 방법
1) ComponentScan
-> 모든 @Component를 찾아서 빈으로 등록함
: @Controller @Repository @Service @Configuration
-> @Component라는 메타 어노테이션을 사용한 어노테이션이므로 @Component라고 볼 수 있으므로 똑같이 빈으로 등록됨
( Repository는 어노테이션이 아니라 인터페이스 상속 받는 방식)
- 빈으로 등록되었는지 샘플로 테스트
package org.springframework.samples.petclinic.sample;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
@RunWith(SpringRunner.class)
@SpringBootTest
class SampleControllerTest {
@Autowired
ApplicationContext applicationContext;
@Test
public void testDI(){
SampleController bean = applicationContext.getBean(SampleController.class);
assertThat(bean).isNotNull();
}
}
2) 직접 빈으로 등록
@Configuration
public class SampleConfig {
@Bean
public SampleController sampleController(){
return new SampleController();
}
}
-> SampleController 클래스가 빈으로 등록이 된다.
2. 적용해보기
1) ApplicationContext에서 직접 꺼내오기
private final OwnerRepository owners;
private final ApplicationContext applicationContext;
private VisitRepository visits;
public OwnerController(OwnerRepository clinicService, VisitRepository visits, ApplicationContext applicationContext) { // IoC
this.owners = clinicService;
this.visits = visits;
this.applicationContext = applicationContext;
}
@GetMapping("/bean")
@ResponseBody
public String bean() {
return "bean : " + applicationContext.getBean(OwnerController.class) + "\n" // 애플리케이션컨텍스트에서 직접 꺼낸 오너리파지토리
+ "owners : " + this.visits; // 애플리케이션컨텍스트가 알아서 주입해준 오너리파지토리?
// ? 왜 다르지, 왜 밑에꺼는 jpa를 반환하지
}
2) Autowired 로 가져오기
@Autowired
private OwnerRepository owners;
'Programming > Spring' 카테고리의 다른 글
활용 4) 외부 설정 : 타입 세이프 프로퍼티 @ConfigurationProperties (0) | 2020.10.11 |
---|---|
활용 3) 외부설정 : application.properties (0) | 2020.10.11 |
활용 2) SpringApplication 2 : 이벤트 리스너, ApplicationArguments (0) | 2020.10.10 |
활용 1) SpringApplication 1 : 커스터마이징, 배너 (0) | 2020.10.10 |
이론 3) 독립적으로 실행되는 jar 파일, 스프링부트 원리 (0) | 2020.10.06 |