🔥 Vamos/Spring

0116 | 스프링의 정석 :: 3-4 (config.xml 실습)

unikue 2023. 1. 16. 23:35

스프링 DI 활용하기 - 실습

: 앞에서 했던 스프링DI를 가지고 정식으로 실습해본다.

 

resources 안에 우리가 bean으로 사용할 config.xml파일을 만들어준다.

👉 config.txt에 키와 값을 만들어줬던것처럼 xml파일에도 동일하게 진행하는 것.

 

class Car{}
class Engine{}
class Door{}

public class SpringDiTest {
    public static void main(String[] args){
    	//xml을 설정파일로 쓰는 application context 생성
        ApplicationContext ac = new GenericXmlApplicationContext("config.xml");
        
        //Car car = (Car)ac.getBean("car"); // byName. 아래와 같은 문장
        Car car = ac.getBean("car",Car.class); // 이름 뒤에 타입정보를 주면 형변환 생략.
        Car car2 = (Car)ac.getBean(Car.class); // byType
        Engine engine = (Engine) ac.getBean("engine");
        Door door = (Door) ac.getBean("door");

        System.out.println("car= "+ car);
        System.out.println("car= "+ car2);
        System.out.println("engine= " + engine);
        System.out.println("door= " + door);
    }
}

car & car2의 주소가 같은 이유는 같은 객체를 반환하기 때문 (기본적으로 싱글톤이라서)

 * 싱글톤 = 클래스 객체를 하나만 생성.

 

👉 만약 getBean 할 때마다 새 객체가 생기길 원한다면 scope를 prototype으로 지정해주면 된다.

    <bean id="car" class="com.fastcampus.ch3.Car" scope="prototype"/>
    <bean id="engine" class="com.fastcampus.ch3.Engine" scope="singleton"/> // 기본이 싱글톤

scope때문에 서로 다른 객체가 반환된다

car.setColor("red"); // setter를 추가하고 이용해서 객체 멤버들 초기화
car.setOil(100);
car.setEngine(engine);
car.setDoors(new Door[]{ac.getBean("door", Door.class), ac.getBean("door", Door.class)});
System.out.println("car= "+ car);

---------------------------
// 이렇게 하지않고 xml파일 내에 property를 이용해서 속성값을 줄 수도 있다.
 <bean id="car" class="com.fastcampus.ch3.Car">
        <property name="color" value="red"/>
        <property name="oil" value="100"/>
        <property name="engine" ref="engine"/>
        <property name="doors">
            <array value-type="com.fastcampus.ch3.Door">
                <ref bean="door"/>
                <ref bean="door"/>
            </array>
        </property>
    </bean>
    <bean id="engine" class="com.fastcampus.ch3.Engine"/>
    <bean id="door" class="com.fastcampus.ch3.Door" scope="prototype"/>
</beans>

👉 property 태그가 setter 를 사용하므로 setter가 꼭 있어야 한다.