[Web] SpringFramework DI java config로 설정하기
앞서 수행했던 SpringFramework DI 설정을 java Configuration으로 수행해보자.
ApplicationConfig.java 파일을 생성한다.
@Configuration 어노테이션을 앞에 붙여줘야 해당 클래스가 Config임을 알릴 수 있다.
ApplicationContext는 파라미터를 받아들이지 않는 빈 생성자 메서드를 모두 실행하고 반환받은 객체를 관리한다. 그래서 Car 에서 c.setEngine(e) 에 e에는 생성되었던 Engine객체가 들어갈 수 있는 것이다.
테스트 하기 위한 ApplicationContextExam03.java
xml 파일을 불러오는 대신 AnnotationConfigApplicationContext() 를 사용한다.
또하나 달라진 점은 getBean() 에서 만들어뒀던 bean의 아이디가 아니라 Car.class를 사용하는 점이다. 아이디를 써주면 오타가 나서 오류가 발생하기 쉽다. Car.class를 사용하면 Car 타입을 갖는 bean을 찾아서 불러오기 때문에 오타를방지 할 수 있는 것!
조금 더 수정해 보자
ApplicationConfig2.java
@ComponentScan("패키지명") 을 추가했다. 이 어노테이션은 Component, controller, service, 등의 어노테이션을 패키지에서 스캔하여 모두 등록해준다. 이제 이 Config 파일에는 따로 bean을 선언 할 필요가 없다!
대신 Car, Engine클래스를 조금 수정해야 한다.
먼저 Car.java
Car 클래스 또한 @Component를 붙여주고 의존관계를 표시하기 위해 Engine 엘리먼트 앞에 @Autowired를 붙여준다. 이제 setEngine 메서드는 필요없다.
Engine.java
위와 같이 수정하고 setter 메서드를 없앳다.
'ApplicationContextExam04.java'를 만들었다. 03.java와 모두 같고 ApplicationConfig2로만 바꿔줬다. 정상적으로 출력이 된다.
다루는 bean이 많아질 수록 xml로 설정하는 것보다 @ 어노테이션을 사용하여 관리하는 것이 더 수월할 것 같다.
@AutoWried는 Field , Construtor, Setter method에 사용할 수 있다. 사용하기 매우 편리하지만 장단점이 있다고 한다.
참고 : https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
ApplicationConfig.java 파일을 생성한다.
@Configuration
public class ApplicationConfig {
@Bean
public Car car(Engine e) {
Car c = new Car();
c.setEngine(e); //전달받은 Engine 객체
return c;
}
// 컴파일 혹은 런타임시에 인식되는 어노테이션. 자바는 다양한 어노테이션을 제공
@Bean
public Engine engine() {
return new Engine();
//jdk5부터 지원. 그것보다 낮은 버전에서는 사용이 불가능
}
}
| cs |
@Configuration 어노테이션을 앞에 붙여줘야 해당 클래스가 Config임을 알릴 수 있다.
ApplicationContext는 파라미터를 받아들이지 않는 빈 생성자 메서드를 모두 실행하고 반환받은 객체를 관리한다. 그래서 Car 에서 c.setEngine(e) 에 e에는 생성되었던 Engine객체가 들어갈 수 있는 것이다.
테스트 하기 위한 ApplicationContextExam03.java
public class ApplicationContextExam03 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ac = new AnnotationConfigApplicationContext(ApplicationConfig.class);
// Car.class -> type이 Car인 bean을 가져온다
Car car = ac.getBean(Car.class); // 등록했던 bean아이디
// engine 탑재한 car 객체가 만들어진것
car.run();
}
}
| cs |
xml 파일을 불러오는 대신 AnnotationConfigApplicationContext() 를 사용한다.
또하나 달라진 점은 getBean() 에서 만들어뒀던 bean의 아이디가 아니라 Car.class를 사용하는 점이다. 아이디를 써주면 오타가 나서 오류가 발생하기 쉽다. Car.class를 사용하면 Car 타입을 갖는 bean을 찾아서 불러오기 때문에 오타를방지 할 수 있는 것!
조금 더 수정해 보자
ApplicationConfig2.java
@Configuration
@ComponentScan("kr.or.connect.diexam01")
public class ApplicationConfig2 {
}
| cs |
@ComponentScan("패키지명") 을 추가했다. 이 어노테이션은 Component, controller, service, 등의 어노테이션을 패키지에서 스캔하여 모두 등록해준다. 이제 이 Config 파일에는 따로 bean을 선언 할 필요가 없다!
대신 Car, Engine클래스를 조금 수정해야 한다.
먼저 Car.java
@Component
public class Car {
@Autowired
private Engine v8;
| cs |
Engine.java
@Component
public class Engine {
public Engine() {
| cs |
위와 같이 수정하고 setter 메서드를 없앳다.
'ApplicationContextExam04.java'를 만들었다. 03.java와 모두 같고 ApplicationConfig2로만 바꿔줬다. 정상적으로 출력이 된다.
다루는 bean이 많아질 수록 xml로 설정하는 것보다 @ 어노테이션을 사용하여 관리하는 것이 더 수월할 것 같다.
@AutoWried는 Field , Construtor, Setter method에 사용할 수 있다. 사용하기 매우 편리하지만 장단점이 있다고 한다.
참고 : https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
No comments: