반응형

빈과 일반 객체의 차이는 !

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;
반응형

+ Recent posts