스프링 설정 클래스를 선언하는 어노테이션
bean을 정의하는 어노테이션
-> AnnotationConfigApplicationContext는 자동으로 실행해 결과로 리턴하는 객체들을 싱글턴으로 관리해줌
@Controller, @Service, @Repository, @Component 어노테이션이 붙은 클래스를 찾아 컨테이너에 등록
컴포넌트 스캔의 대상이 되는 애노테이션 중 하나로써 주로 유틸, 기타 지원 클래스에 붙이는 어노테이션
주입 대상이되는 bean을 컨테이너에 찾아 주입하는 어노테이션
package kr.or.connect.diexam01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
	@Bean
	public Car c(Engine e) {
		// 파라미터를 받아들이지 않는 객체 생성
		Car c= new Car();
		c.setEngine(e);
		return c;
	}
	
	@Bean
	public Engine engine() {
		return new Engine();
	}
}package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextExam03 {
	public static void main(String[] args) {
		// ApplicationConfigs에서 설정해준 Bean들을 만들어 가지고 있다가 사용자의 요청에 의해 결과 반환
		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		
		// Bean을 객체의 이름에 따라 요청하는 과정
		//Car car=(Car) ac.getBean("car");
		// Bean을 객체의 타입에 따라 요청하는 과정 -> 객체의 이름에 상관없이 가져올 수 있다
		Car car = (Car) ac.getBean(Car.class);
		car.run();
	}
}
package kr.or.connect.diexam01;
import org.springframework.stereotype.Component;
//컴포넌트 어노테이션 추가
@Component
public class Engine {
	public Engine() {
		System.out.println("Engine 생성자");
	}
	public void exec() {
		System.out.println("엔진이 동작합니다.");
	}
}
package kr.or.connect.diexam01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
	@Autowired
	private Engine v8;
	public Car() {
		System.out.println("Car 생성자");
	}
	public void setEngine(Engine e) {
		this.v8=e;
	}
	public void run() {
		System.out.println("엔진을 이용하여 달립니다.");
		v8.exec();
	}
}package kr.or.connect.diexam01;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
//어노테이션 붙은 클래스를 자동으로 등록할 수 있도록 함
//반드시 정확한 패키지명을 입력해줘야 패키지 내의 컴포넌트를 스캔함
//컨트롤러, 서비스, 레포지토리, 컴포넌트 등의 어노테이션이 붙어있는 클래스들을 Bean으로 등록해줌
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextExam04 {
	public static void main(String[] args) {
		ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
		Car car = (Car)ac.getBean(Car.class);
		car.run();
	}
}