오늘은 이미 만들어져 있는 객체를 가져와서(참조해서) 사용하는 방법을 배워보겠습니다.
그 전에 생성자 주입, setter주입은 같이 사용할 수도 있다는거 알고 계셨나요?
com.test03 패키지를 만들어서 간단히 보여드리겠습니다.
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;
}
}
Emp.java
package com.test03;
public class Emp {
private String name;
private int salary;
public Emp() {
}
public Emp(String name, int salary) {
super();
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "이름 : " + name + " 월급 : " + salary;
}
}
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;
}
}
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 = factory.getBean("lee", Emp.class);
System.out.println(hong);
System.out.println(lee);
}
}
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="hong" class="com.test03.Engineer">
<constructor-arg name="name" value="홍길동" />
<constructor-arg name="salary" value="3000000" />
<property name="dept" value="기술" />
</bean>
<bean id="lee" class="com.test03.Developer">
<constructor-arg name="name" value="이순신" />
<constructor-arg name="salary" value="2500000" />
<property name="dept" value="개발" />
</bean>
</beans>
코드 실행결과
이 코드는 더욱 간단하게 그림으로 설명하겠습니다.
- applicationContext에 <constructor-arg>의 값이 Engineer(Developer도 같습니다.)의 생성자에 담긴다.
- 그렇게 담겨져 있는값은 super( )에 의해 부모의 것으로 간다(Engineer와 Developer는 Emp 클래스를 상속받고 있습니다.)
- <property>의 값은 Engineer의 setter의 값으로 들어가게 된다.
이렇게 객체를 만들면서 생성자 주입과 setter주입은 한번에 사용도 가능합니다.
이제 본격적으로 만들어진 객체를 가져오는것을 해보겠습니다.
com.test04 패키지를 만듭니다. (패키지 구조는 비슷하게 만들었습니다.)
Developer.java
package com.test04;
public class Developer {
private Emp emp;
private String dept;
public Developer() {
}
public Developer(Emp emp, String dept) {
super();
this.emp = emp;
this.dept = dept;
}
@Override
public String toString() {
return emp + "\t 부서 : " + dept;
}
}
Emp.java
package com.test04;
public class Emp {
private String name;
private int 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 "이름 : " + name + "\t 월급 : " + salary;
}
}
Engineer.java
package com.test04;
public class Engineer {
private Emp emp;
private String dept;
public Engineer() {
}
public Engineer(Emp emp, String dept) {
super();
this.emp = emp;
this.dept = dept;
}
@Override
public String toString() {
return emp + "\t 부서 : " + dept;
}
}
MTest.java
package com.test04;
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/test04/beans.xml");
Developer lee = factory.getBean("lee-ss", Developer.class);
Engineer hong = (Engineer) factory.getBean("hong-gd");
System.out.println(lee);
System.out.println(hong);
}
}
이번에는 완성된 beans.xml을 보기전에 어떤걸 해야하는지 먼저 알아보겠습니다.
이렇게 만들어진 객체에다가
이 객체값을 넣어서 사용하고 싶은겁니다.
그러려면 객체를 가지고 와야하는데
이런식으로 사용하게되면 왜인지 모를 에러가 발생하게 되는데요
위의 Developer를 보면 첫번 째 생성자 파라미터가 emp이고 두번 째 생성자 파라미터가 String입니다.
String이나 int의 경우 value속성으로 값을 넣어주면 됩니다.
객체를 가져올 때는 value 속성대신 ref(참조:레퍼런스) 속성을 가져와서 사용해주면 됩니다.
이렇게 완성된 beans.xml을 보시면
beans.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.test04.Emp">
<property name="name" value="이순신"/>
<property name="salary" value="3000000"/>
</bean>
<bean id="hong" class ="com.test04.Emp">
<property name="name" value="홍길동"/>
<property name="salary" value="2500000"/>
</bean>
<bean id="lee-ss" class ="com.test04.Developer">
<constructor-arg name="emp" ref="lee"/>
<constructor-arg name="dept" value="개발"/>
</bean>
<bean id="hong-gd" class ="com.test04.Engineer">
<constructor-arg name="emp" ref="hong"/>
<constructor-arg name="dept" value="기술"/>
</bean>
</beans>
코드 실행결과
이렇게 동작하게 됩니다.
'Java > Spring' 카테고리의 다른 글
[Spring] Namespace가 안 나올 때 (0) | 2021.06.19 |
---|---|
[Spring] 05. <bean> 속성 사용하기 (0) | 2021.06.18 |
[Spring] 03. Singleton(싱글톤)으로 객체 선언하기 (0) | 2021.06.14 |
[Spring] 02. bean 객체 생성하기(02) (0) | 2021.06.12 |
[Spring] 02. bean 객체 생성하기(01) (0) | 2021.06.11 |