Spring IoC/DI 컨테이너(xml파일을 이용한 설정2)

oyeon·2021년 1월 14일
0
  1. Engine.java 생성
package kr.or.connect.diexam01;

public class Engine {
	public Engine() {
		System.out.println("Engine 생성자");
	}
	public void exec() {
		System.out.println("엔진이 동작합니다.");
	}
}
  1. Car.java 생성
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();
	}
//	public static void main(String[] args) {
//		Engine e = new Engine();
//		Car c = new Car();
//		c.setEngine(e);
//		c.run();
//	}
}
  1. applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	   
<!-- spring 컨테이너한테 내가 생성할 객체를 대신 생성하게 하려고 한다. 이를 위해 bean으로 정보를 전달한다.
   spring 컨테이너는 이런 객체를 1개만 갖고 있다. 이를 싱글턴 패턴이라고 한다.
   UserBean userBean = new UserBean();와 같은 의미 -->
   <bean id ="userBean" class="kr.or.connect.diexam01.UserBean"/>
   
   <!-- Engine e = new Engine();와 같은 의미 -->
   <bean id = "e" class="kr.or.connect.diexam01.Engine"/>
	   
   <!-- Car c = new Car();와 같은 의미 -->
   <bean id = "c" class="kr.or.connect.diexam01.Car">
	<!-- Car 인스턴스에  Engine을 set하려면  property를 추가해야 한다. -->
	<!-- c.setEngine(e);와 같은 의미 -->
	<property name="engine" ref="e"></property>
   </bean>
</beans>
  1. ApplicationContextExam02.java 생성
package kr.or.connect.diexam01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ApplicationContextExam02 {
    public static void main(String[] args) {
	ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
		
	/* Car객체에 Engine객체가 주입되어 run을 사용하는 것을 볼 수 있다.
	 * 이처럼 객체에 객체를 주입하는 것을 DI라고 한다.
	 */
	Car car = (Car)ac.getBean("c");
	car.run();		
    }
}
  • 결과

생각해 보기

  • Spring 컨테이너가 관리하는 객체를 빈(Bean)이라고 한다.
    (직접 new연산자로 생성해서 사용하는 객체는 빈(Bean)이라고 말하지 않는다.)
  • Spring은 빈을 생성할 때 기본적으로 싱글톤(Singleton)객체로 생성한다.
  • 싱글톤이란 메모리에 하나만 생성한다는 것입니다.
  • 메모리에 하나만 생성되었을 경우, 해당 객체를 동시에 이용한다면 어떤 문제가 발생할 수 있을까?
  • 이런 문제를 해결하려면 어떻게 해야할까?
    (참고로 Spring에서 빈을 생성할 때 스코프(scope)를 줄 수 있다. 스코프를 줌으로써 기본으로 설정된 싱글톤 외에도 다른 방법으로 객체를 생성할 수 있다.)

    reference
    https://atoz-develop.tistory.com/entry/Spring-%EB%B9%88%EC%9D%98-Scope-%EC%8B%B1%EA%B8%80%ED%86%A4%EA%B3%BC-%ED%94%84%EB%A1%9C%ED%86%A0%ED%83%80%EC%9E%85

profile
Enjoy to study

0개의 댓글