(제어의 역전)IoC - 제어의 흐름을 전통적인 방식과 다르게 뒤바꾸는 것
Inversion of Control 여기서 control은 if, for문 이다.-> 실행흐름이 바뀌는 것
전통적인 방식
사용자 코드가 Framework 코드를 호출
Car car = new Car();
car. turboDrive() 하면
turboDrive()호출
IoC
FrameWork 코드가 사용자 코드를 호출
engine.start()이 -> car.drive(new SuperEngine()); 호출
다른 사람이 만든 코드를 우리가 호출하는 방식이 되는 것이다. -> 변하지않는 코드와 변하는 코드의 분리가 가능해진다.
의존성 주입 DI - 사용할 객체를 외부에서 주입받는 것
인스턴스 변수(iv), setter, 참조형 매개변수를가 진 생성자, 메서드에 적용
생성자에는 생략이 가능하다.
생략하면 Bean을 생성할때 이 생성자를 이용해서 생성하고 생성자의 참조 매개변수의 타입을 찾아서 넣어준다.
But 생성자가 여러개이면 @Autowired 붙여주는게 좋다.
Spring container에서 타입으로 빈을 검색해서 참조 변수에 자동 주입(DI)
검색된 빈이 n개이면, 그 중에 참조변수와 이름이 일치하는 것을 주입한다.
주입 대상이 변수일 때 ,검색된 빈이 1개 아니면 예외 발생
주입 대상이 배열일때, 검색된 빈이 n개라도 예외 발생 X
@Aotowired(required = false)일 때, 주입할 빈을 못 찾아도 예외 발생X.
Spring container에서 이름으로 빈을 검색해서 참조 변수에 자동 주입(DI)
일치하는 이름의 빈이 없으면, 예외 발생
//@Resource(name = "engine")
//둘이 같은 뜻
@Resource
Engine engine;
//engine이 자동으로 이름이 된다.
<component-scan>
로 @Component가 클래스를 자동 검색해서 빈으로 등록
@Controller, @Service, @Repository, @ControllerAdvice의 메타 애너테이션
<context:component-scan base-package="com.fastcampus.ch3">
이렇게 있으면 하위의 서브패키지까지 검색한다.
@Component
@PropertySource("setting.properties")
class SysInfo{
String timeZone;
String currDir;
String autosaveDir;
int autosaveInerval;
boolean autosave;
}
이런 코드가 있고 setting.properties이라는 파일의 내용이
autosaveDir=/autosave
autosave=true
autoInterval = 30
이렇다면 각각의 값들이 안에다 대입이 된다.
값 지정할때
systemPronperties값이나 systemEnvironment의 값을 가져와 주입이 가능하다.