뉴렉쳐 스프링 프레임워크 정리/Part1. DI
[Spring 개념정리] Java를 통한 Configuration
째로스
2023. 7. 14. 14:38
목표
xml 대신 Java 코드를 통해 설정파일을 작성한다.
기존 xml 설정 파일 작성방식
<!-- setting.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="spring.di.ui"/>
<bean id="exam" class="spring.di.entity.NewLecExam"/>
<beans>
위와 같이 xml로 작성된 설정파일을 Java 코드로 만들면 아래와 같다.
Java 코드로 작성한 설정 파일
@ComponentScan("spring.di.ui")
@Configuration
public class NewlecDIConfig {
@Bean
public Exam exam() {
return new NewlecExam();
}
}
@Configuration : Java로 작성한 설정 파일임을 알림
@ComponentSacn("spring.di.ui") = <context:component-scan base-package="spring.di.ui"/>
@Bean public Exam exam(){return new NewlecExam()} = <bean id="exam" class="spring.di.entity.NewLecExam"/>
으로 똑같이 작성할 수 있다.
@Bean 어노테이션은 @Component 어노테이션과 같이 객체를 생성할 때 사용되는 어노테이션이다.
다만 다른점이 있다면, @Bean은 메소드를 통해 리턴되는 객체를 IoC 컨테이너에 생성하는 것이고,
@Component는 클래스 자체를 객체로 만들어 IoC 컨테이너에 저장한다는 점이다.
주로 @Bean은 외부 라이브러리에서 반환되는 객체를 IoC 컨테이너에 담아야할 경우 사용된다.
다만 xml 대신 Java 코드로 설정파일로 생성한 IoC 컨테이너를 사용하기 위해서는 하나 더 수정해줘야 할게 있다.
public class Program {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(NewlecDIConfig.class);
ExamConsole console = (ExamConsole) context.getBean("console");
//ExamConsole console = context.getBean(ExamConsole.class);
console.print();
}
}
바로 context 변수를 생성할 때, AnnotationCofingApplicationContext 생성자에 해당 클래스를 주입하여 설정파일을
가져와야 한다.
여러 개의 Java 설정 파일을 사용해야할 경우는 아래와 같다.
public class Program {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(AppConfig.class,OtherConfig.class);
context.register(NewlecDIConfig.class);
context.refresh();
ExamConsole console = (ExamConsole) context.getBean("console");
console.print();
}
}