Java 관련/Spring Legecy

[Spring] DI / IoC (Bean 객체 생성_05) - construct-arg와 property 동시 사용도 될까?

씨네 2022. 3. 14. 14:07
728x90

construct-arg와 property를 혼합해서 사용 할 수 있을까요?

경우에 따라서 있다라고 할수 있습니다.

그러면 코드 예시를 통해 어떤식으로 같이 사용 할 수 있는지 알아보겠습니다.

패키지 구조

Emp.java

package com.test02;

public class Emp {

	private String name;
	private int salary;
	
	
	public Emp() {
	}
	
	public Emp(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	
	@Override
	public String toString() {
		return "Emp [name=" + name + ", salary=" + salary + "]";
	}
	
}

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">

	<bean id="lee" class="com.test02.Emp">
		<constructor-arg name="name" value="이순신" />
		<constructor-arg name="salary" value="3000000" />
	</bean>
	
	<bean id="hong" class="com.test02.Emp">
		<property name="name" value="홍길동" />
		<property name="salary" value="2500000" />
	</bean>
	

</beans>

MTest.java

package com.test02;

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

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test02/applicationContext.xml");
		Emp lee = (Emp) factory.getBean("lee");
		Emp hong = (Emp) factory.getBean("hong");
		
		System.out.println(lee);
		System.out.println(hong);
	}

}

실행 결과

해당 코드에서 보면 Emp클래스에 파라미터가 있는 생성자와 기본생성자, setter, getter가 모두 만들어져 있습니다.

그렇기에 applicationContext.xml에서

<bean id="lee" class="com.test02.Emp">
	<constructor-arg name="name" value="이순신" />
	<constructor-arg name="salary" value="3000000" />
</bean>
	
<bean id="hong" class="com.test02.Emp">
	<property name="name" value="홍길동" />
	<property name="salary" value="2500000" />
</bean>

constructor-arg를 이용한 방법과 property를 이용한 방법 두가지 방법으로 bean객체에 값을 주입하였습니다.


패키지 구조

Emp와 이를 상속받는 Developer와 Engineer가 있습니다.

Emp.java

package com.test03;

public class Emp {
	private String name;
	private int salary;
	
	
	public Emp(String name, int salary) {
		this.name = name;
		this.salary = salary;
	}
	public Emp() {
	}
	
	
	@Override
	public String toString() {
		return "이름 : " + name + " 월급 : " + salary;
	}

}

Developer.java

package com.test03;

public class Developer extends Emp {
	
	private String dept;
	
	public Developer() {
		
	}

	public Developer(String name, int salary) {
		super(name, salary);
	}

	public void setDept(String dept) {
		this.dept = dept;
	}

	@Override
	public String toString() {
		return super.toString() + " 부서 : " + dept;
	}

}

Engineer.java

package com.test03;

public class Engineer extends Emp {
	
	private String dept;

	public Engineer() {
	}

	public Engineer(String name, int salary) {
		super(name, salary);
	}

	public void setDept(String dept) {
		this.dept = dept;
	}

	@Override
	public String toString() {
		return super.toString() + " 부서 : " + dept;
	}

}

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">

	<!-- 홍길동, 2500000, 기술 -->
	<bean id="hong" class="com.test03.Engineer">
		<constructor-arg index="0" value="홍길동" />
		<constructor-arg index="1" value="2500000" />
		<property name="dept" value="기술" />
	</bean>
	
	<!-- 이순신, 3000000, 개발 -->
	<bean id="lee" class="com.test03.Developer">
		<constructor-arg name="name" value="이순신" />
		<constructor-arg name="salary" value="3000000" />
		<property name="dept" value="개발" />
	</bean>
</beans>

MTest.java

package com.test03;

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

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test03/applicationContext.xml");
		
		Emp hong = (Emp) factory.getBean("hong");
		Emp lee = (Emp) factory.getBean("lee", Emp.class);
		
		System.out.println(hong);
		System.out.println(lee);
	}

}

실행결과

해당 코드에서는 상속받은것 이외에 위에 코드와 크게 다를건 없습니다.

다만 applicationContext.xml에서 보면

<bean id="hong" class="com.test03.Engineer">
	<constructor-arg index="0" value="홍길동" />
	<constructor-arg index="1" value="2500000" />
	<property name="dept" value="기술" />
</bean>
	
<bean id="lee" class="com.test03.Developer">
	<constructor-arg name="name" value="이순신" />
	<constructor-arg name="salary" value="3000000" />
	<property name="dept" value="개발" />
</bean>

빈객체 안에 constructor-arg와 property두개 태그 모두 들어가 있네요!

넣어줄 값의 인덱스나 이름 등을 잘 맞춰 넣어주면 해당 방법도 사용이 가능합니다.

(setter가 만들어져 있지 않다면 property 태그는 사용할수 없으니 주의해주세요!)

728x90