IoC 제어의 역전
IoC가 아닐경우
private Person person = new Person();
내가 쓸 놈은 내가 만들어서 쓸게..
IoC인 경우
private Person person;
public PersonController(Person person) {
this.person = person;
}
내가 쓸 놈은 이 놈인데, 누군가 알아서 주겠지..
IoC 컨테이너
빈들의 의존성을 관리 (빈이 아니면 관리 X)
IoC 컨테이너의 종류
1) BeanFactory
빈의 등록 / 생성 / 조회 / 반환을 관리함
getBean()을 호출해야 빈을 생성함 (Lazy Loading)
2) ApplicationContext
BeanFactory 인터페이스를 상속하여 좀 더 많은 기능을 제공한다
BeanFactory 보다는 ApplicationContext를 사용하는 것이 좋다
applicationContext를 호출하여 직접 쓸 일은 거의없다.
IoC 컨테이너를 굳이 보고싶다면..
@RestController
public class ExampleController {
@Autowired
ApplicationContext applicationContext; // applicationContext 자신도 빈으로 등록되어 있다
@GetMapping("")
public String context() {
return applicationContext.getBean(Person.class);
}
}
빈 (Bean)
스프링 IoC 컨테이너가 관리하는 객체
빈으로 등록하는 법
1) Component Scanning
@Component
- @Controller
- @Service
- @Repository
스프링 부트로 어플리케이션을 실행 시키는 어노테이션인 @SpringBootApplication
를 들어가보자
...
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
어플리케이션 실행 시 @ComponentScan
을 통해서 @Component
어노테이션이 달려있는 녀석들을 스캔하여 빈으로 등록해주는 것이다
2) XML이나 자바 설정 파일에 등록
@Bean
public String geonHee() {
return "geonHee";
}
빈을 정의할 때는 @Configuration
을 정의한 곳에서 정의해야 한다
등록한 빈을 꺼내서 쓰는 방법
1) @Autowired / @Resource / @Inject
@Autowired
Spring
에서 지원하는 어노테이션 (스프링에 종속적)- 타입으로 연결 안되면 이름
- 강제 연결 : @Qualifier("title")
@Resource
Java
에서 지원하는 어노테이션- 이름으로 연결 안되면 타입
- 강제 연결 : @Resource(name="title")
@Inject
Java
에서 지원하는 어노테이션- 타입으로 연결 안되면 이름
2) ApplicationContext에서 getBean()으로 직접 꺼내서 사용
- 비추
DI (Dependency Injection)
의존성 주입
의존성 주입을 어떻게 해야할까
- 생성자
생성자가 1개
이고, 파라미터가 빈
이면 @Autowired를 생략해도 주입을 해준다.
- 필드
- Setter
어떤 주입 방식을 쓰는게 좋을까
어떠한 클래스에 반드시 필요한 의존성인 경우 -> 생성자
Setter가 있다면 -> Setter
Setter가 없다면 -> 필드
참고
https://www.inflearn.com/course/spring/dashboard
'Spring' 카테고리의 다른 글
멀티 모듈 세팅하기 (0) | 2022.08.02 |
---|---|
스프링 컨트롤러 파라미터 한글 깨짐 현상 (0) | 2022.04.11 |
스프링 3대 핵심 - ② PSA (Portable Service Abstraction) (0) | 2020.02.18 |
Spring-PetClinic 프로젝트 실습 1 (0) | 2019.05.14 |
스프링 AOP 개념 (2) | 2018.12.24 |
댓글