<3. Java Config를 이용한 설정>
http://www.edwith.org/boostcourse-web
* Java Config를 이용해 설정하기
ApplicationConfig.java
package kr.or.connect.diexam01;
import org.springframework.context.annotation.*;
@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();
}
}
@Configuration 은 스프링 설정 클래스라는 의미를 가진다.
JavaConfig로 설정을 할 클래스 위에는 @Configuration가 붙어 있어야 한다. ApplicationContext중에서 AnnotationConfigApplicationContext는 JavaConfig클래스를 읽어들여 IoC와 DI를 적용하게 된다.
이때 설정파일 중에 @Bean이 붙어 있는 메소드들을 AnnotationConfigApplicationContext는 자동으로 실행하여 그 결과로 리턴하는 객체들을 기본적으로 싱글턴으로 관리를 하게 된다.
ApplicationContextExam03.java
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 ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Car car = (Car)ac.getBean("car");
car.run();
}
}
xml로 설정했을 때와 달리, AnnotationConfigApplicationContext를 사용하며 설정을 가지고 있는 클래스인 ApplicationConfig.class 파일을 읽어들인다.
파라미터로 id 대신 요청하는 class 타입을 지정할 수 있다. => Car car = ac.getBean(Car.class);
ApplicationConfig2.java
package kr.or.connect.diexam01;
import org.springframework.context.annotation.*;
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
기존 JavaConfig에서 빈을 생성하는 메소드를 모두 제거하고 @Configuration아래에 @ComponentScan이라는 어노테이션을 추가한다.
@ComponentScan어노테이션은 파라미터로 들어온 패키지 이하에서 @Controller, @Service, @Repository, @Component 어노테이션이 붙어 있는 클래스를 찾아 메모리에 전부 올려준다.
동작을 위해 아래와 같이 기존의 Car클래스와 Engine클래스 위에 @Component를 붙여준다.
Engine.java
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("엔진이 동작합니다.");
}
}
Car.java
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 run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
}
setEngine() 메서드를 없애고 @Autowired를 추가했다. 알아서 Engine 타입의 객체를 찾아서 주입해 주도록 하는 것.
수정된 JavaConfig를 읽어들이여 실행하는 클래스이다.
ApplicationContextExam04.java
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 = ac.getBean(Car.class);
car.run();
}
}
Spring에서 사용하기에 알맞게 @Controller, @Service, @Repository, @Component 어노테이션이 붙어 있는 객체들은 ComponentScan을 이용해서 읽어들여 메모리에 올리고 DI를 주입하도록 한다.
이러한 어노테이션이 붙어 있지 않은 객체는 @Bean 어노테이션을 이용하여 직접 생성해주는 방식으로 클래스들을 관리하면 편리하다.
'BoostCource > Back-end' 카테고리의 다른 글
#03. BE - Spring MVC 개념과 동작흐름 (0) | 2018.08.03 |
---|---|
#03. BE - Spring JDBC 기초와 실습 (0) | 2018.08.02 |
#03. BE - xml파일을 이용하여 의존성주입 설정하기 (0) | 2018.08.02 |
#03. BE - Spring Framework 기초 (0) | 2018.07.20 |
#02. BE - Web API (0) | 2018.07.18 |