▶ 의존성 주입
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 태그를 사용해서 주입해 주어야한다.
'spring' 카테고리의 다른 글
[500에러] org/apache/commons/fileupload/FileItemFactory 해결방법 (0) | 2022.04.28 |
---|---|
Spring Maven 스프링 메이븐 설치 및 환경 변수 설정 (0) | 2022.04.26 |
이클립스 sts 설치 오류 : Spring Legacy Project 생성 안됨 (1) | 2022.04.26 |
댓글