package kr.or.connect.diexam01;
public class Car {
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;
public class Engine {
public Engine() {
System.out.println("Engine 생성자");
}
public void exec() {
System.out.println("엔진이 동작합니다.");
}
}
package kr.or.connect.diexam01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Bean
public Car car(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;
public class ApplicationContextExam03 {
public static void main(String[] args) {
/* ApplicationContext중에서 AnnotationConfigApplicationContext는
* JavaConfig클래스를 읽어들여 IoC와 DI를 적용한다.
* 이때 설정파일 중에 @Bean이 붙어 있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행하여
* 그 결과로 리턴하는 객체들을 기본적으로 싱글턴으로 관리 한다.
*/
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
// Car car = (Car)ac.getBean("car"); // ApplicationConfig의 메서드 이름 "car"
// 다음 방식이 더 좋다.
Car car = (Car)ac.getBean(Car.class); // class 이름이 변경되어도 상관없다.
car.run();
}
}
package kr.or.connect.diexam01;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
package kr.or.connect.diexam01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
// @Autowired : Engine 타입의 객체가 생성된 것이 있으면 알아서 v8에 주입하라는 의미
@Autowired
private Engine v8;
public Car() {
System.out.println("Car 생성자");
}
// @Autowired로 setter메서드 대체
// public void setEngine(Engine e) {
// this.v8 = e;
// }
public void run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
}
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.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ApplicationContextExam04 {
public static void main(String[] args) {
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig2.class);
Car car = (Car)ac.getBean(Car.class);
car.run();
}
}
결과