DI(Defendency Inject)

public class Car {
	//결합도가 강하다(높다)
	private Engine engine = new Enging();
	//결합도가 강하다(높다)  
	public Car(){
		this.engine = new Enging();
	}

	//결합도가 약하다(낮다)
	public Car(Enging engine){
		this.engine = engine;
	}
	//결합도가 약하다(낮다)
	public void setEngine(Engine enginge){
		this.engine = engine;
	}
	
}

public class Engine{

}

-------------------------------------
Car car = new Car();

Engine engine = new Engine();
car.setEngine(engine);

IOC

Inversion of Controll(제어의 역전)

개발자가 아닌 Spring Container로 제어를 맡김

객체 생성

1. Annotation
	 @Controller("빈의 이름")      : 객체 생성, Constroller 역할
	 @Service("빈의 이름")         : 객체 생성, Service 역할
	 @Repository("빈의 이름")      : 객체 생성, DAO 역할
	 @Mapper                       : 
	 @Component("빈의 이름")       : 객체 생성, 그외 클래스

서버가 처음 실행시 베이스패키지및 하위 패키지 까지 annotaion을 스캔해서 작동
생성된 객체를 객체 pool에 저장 하고 있다가 필요 할때 꺼내 씀

생성된 객체는 Singletone 

객체 주입

1. Annotation
	 @Autowired
	 @Qualifier("빈의 이름")

	public class Car{
		@Autowired
		private Engine engine;
		
		public Car(@Autowired Engine engine){}
		
		@Autowired
	  public void setEngine(@Autowired Engine engine){}

}

객체 pool에서 선언된 데이터타입과 일치하는 타입을 꺼내서 주입
1. 일치하는 타입을 먼저 찾고
2. 없으면(또는 2개 이상이면) 변수명과 bean의 이름이 같은것을 찾음

# bean의 이름
1. 아무런 설정이 없으면 클래스명의 첫글자를 소문자로 한것이 이름이 됨

Configuration

@Configuration

클래스 선언부에 작성
Spring container에 Bean 정의 할 수 있도록 사용 될수 있는 class를 나타냄
주로 @Bean 과 함께 사용

@Bean 
수동으로 Bean을 등록 할 때 사용