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