본문 바로가기
spring

Spring 스프링 의존성 주입 방법 [생성자/setter]

by 자바비터 2022. 4. 7.

▶ 의존성 주입

Spring Framework가 지원하는 핵심 기능으로 객체 사이의 의존 관계가 객체 자신이 아닌 외부(조립기)에 의해 설정된다.

이 때, 컨테이너는 A객체가 필요로 하는 의존 관계에 있는 다른 객체 B객체를 직접 생성하여 A객체로 주입(설정)해주는 역을 한다.

  

  

▶ 의존성 주입 장점

- 클래스들 간의 의존 관계를 최소화하여 코드를 단순화 할 수 있음

- 애플리케이션을 더 쉽게 유지 및 관리할 수 있음

- 기존 구현 방법은 개발자가 직접 코드 안에서 객체를 생성과 소멸을 제어했찌만 의존성 주입은 객체의 생성, 소멸과 객체 같의 의존 관계를 컨테이너가 제어함

  

  

▶ 스프링의 의존성 주입 방법

1. 생성자에 의한 주입

2. setter에 의한 주입

 

 

property : setter를 이용해 값을 주입할 때 사용

constructor-arg : 생성자를 이용해 값을 주입할 때 사용

id : 빈 객체의 고유이름으로 빈id를 이용해 빈에 접근한다.

  

  

▶ Spring 의존성 주입 예제 - setter에 의한 주입 방법

package com.spring.ex01;

//두 예제에 공통적으로 사용될 interface
public interface PersonService {
	public void sayHello();
}

   

setter 사용

package com.spring.ex01;

public class PersonServiceImpl implements PersonService {
	private String name;
	private int age;
	
    //setter
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void sayHello() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age);
	}
}

    

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
                             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
	<bean id="personService" class="com.spring.ex01.PersonServiceImpl">
		<property name="name"> <!-- setter를 이용해 값을 주입할 때 property를 사용한다.-->
			<value>홍길동</value>	
		</property>
	</bean>
</beans>

  

main메소드

package com.spring.ex01;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class PersonTest {
	public static void main(String[] args) {
		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
		PersonService person = (PersonService) factory.getBean("personService");
		//id가 personService인 빈을 가져온다.
		person.sayHello(); //생성된 빈을 이용해 name값을 출력합니다.
	}
}

실행 결과 화면

예제에 보이는거와 같이 setter에 의한 의존성 주입 방법을 사용하면 빈(Bean)을 정의하는 xml에서는

property 태그를 사용해서 주입해 주어야 한다.

 

 

▶ Spring 의존성 주입 예제 - 생성자에 의한 주입 방법

package com.spring.ex01;

//두 예제에 공통적으로 사용될 interface
public interface PersonService {
	public void sayHello();
}

 

생성자 사용

package com.spring.ex02;

public class PersonServiceImpl implements PersonService {
	private String name;
	private int age;
	
    //생성자1
	public PersonServiceImpl(String name) {
		this.name = name;
	}
	
    //생성자2
	public PersonServiceImpl(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public void sayHello() {
		System.out.println("이름 : " + name);
		System.out.println("나이 : " + age + "살");
	}
}

 

person.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
                             "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
	<bean id="personService1" class="com.spring.ex02.PersonServiceImpl">
		<constructor-arg value="이순신" /> <!--생성자를 이용해 값을 주입할 때는 constructor-arg 사용-->
	</bean>
	
	<bean id="personService2" class="com.spring.ex02.PersonServiceImpl">
		<constructor-arg value="손흥민" />
		<constructor-arg value="23" />
 	</bean> 
</beans>

 

main 메소드

package com.spring.ex02;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

public class PersonTest2 {
	public static void main(String[] args) {
		BeanFactory factory = new XmlBeanFactory(new FileSystemResource("person.xml"));
		PersonService person1 = (PersonService) factory.getBean("personService1");
		//id가 personService1인 빈을 가져옵니다.
		person1.sayHello(); //생성된 빈을 이용해 name값을 출력합니다.
		System.out.println();
		
		PersonService person2 = (PersonService) factory.getBean("personService2");
		person2.sayHello();
	}
}

실행 결과 화면

생성자에 의한 의존성 주입 방법을 사용하면 빈(Bean)을 정의하는 xml에서는

constructor-arg 태그를 사용해서 주입해 주어야한다.

 

댓글