[SPRING] Spring 의존성
스프링 의존성 관리 방법 : IoC(Inversion of Control) 개발자가 몇가지 데이터를 설정해주면 전체 프로그램 제어를 프레임워크가 하는 것
스프링이 IoC를 지원하는 두 가지 형태
-Dependency Lookup : 컨테이너가 애플리케이션 운용에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색(Lookup)하는 방식 (잘 사용하지 않음)
-Dependency Injection : 객체사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리한다. 의존성 설정을 바꾸고 싶을 때 프로그램 코드를 수정하지 않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있다. 유지보수 시 편리하다 (Setter Injection : Setter 메소드 기반 / Constructor Injection : 생성자 기반/java 이용)
1.Setter Ingection 이용하기
Setter 메소드를 호출하여 이용하는 방법인데, Setter 메소드는 스프링 컨테이너가 자동으로 호출해준다. 호출 시점은 <bean>가 생성된 직후이다. Setter 메소드와 기본 생성자가 필요하다.
property 속성
-ref : 다른 <bean> 객체를 인자로 넘길 때 사용
-value : 기본형 데이터를 넘길 때 사용
-name : name이 cat이라고 지정되어 있으면 setCat()이 호출된다.
<property name="호출하고자 하는 메소드 이름" ref="빈객체 이름"/>
2.Constructor Ingection 이용하기
스프링 컨테이너는 XML 설정 파일에 등록된 클래스를 찾아서 객체를 생성할 때 기본적으로 매개변수가 없는 기본 생성자를 호출한다. 컨테이너가 기본 생성자 말고, 매개변수를 가지는 다른 생성자를 호출할 수 있도록 생성자 인젝션을 사용하여 설정 가능하다.
cat1 객체는 MyCats 클래스이다.
MyCats 클래스에는 name, age, hobbys를 인자로 받아와서 필드값을 초기화 시켜주는 생성자가 있었다.
생성자에 값을 넘겨주기 위해서 constructor-arg 를 사용한다. 생성자에서 받아오는 인자 순서대로 이름, 나이, 취미를 넣어준다.
catsInfo 객체는 Cats 클래스이다.
Cats 클래스에는 myCats를 인자로 받아와서 필드에 있는 myCats의 값을 초기화 시켜준다.
cat1 bean 객체를 참조하겠다고 작성했기 때문에 첫번째 객체인 cat1의 값들이 넘어가서 생성자를 통해 초기화된다.
만약 cat2를 추가하고 싶다면
Cats 클래스에서 두 번째 고양이도 출력될 수 있게 set 메소드 추가
setMyCatsInfo() 메서드에서 인자값으로 myCats를 받아와서 myCats에 값을 넣어준다. 그리고 메인 클래스에서 받으면 된다.
첫 번째 고양이는 catsInfo라는 객체에서 cat1을 참조하기 때문에 따로 set을 해주지 않아도 된다.
두 번째 고양이의 객체는 참조하고 있지 않으니 직접 set해준다. getBean 을 통해서 cat2객체를 얻어와서 위에서 생성한 setMyCatsInfo에 인자값으로 넣어준다. 그럼 Cats 클래스에서 받아온 인자값을 필드 값에 넣는다. 그리고 getMyCatsInfo()를 호출해서 cat2의 ㄱ밧이 들어간 정보를 출력해준다.
도움이 많이 된 https://private.tistory.com/40?category=655784 님 감사합니다.
------
지금부터는 기록용이니 안보셔도 됩니다. 틀린 부분이 있을 수 있습니다.
<?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="tv" class="polymorphism.SamsungTV">
<constructor-arg ref="sony"></constructor-arg> <!-- 생성자 의존 주입 -->
<constructor-arg value="200000"></constructor-arg>
</bean>
<bean id="sony" class="polymorphism.SonySpeaker"></bean>
</beans>
applicationContext.xml
package polymorphism;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class TVUser {
public static void main(String[] arhs) {
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
TV tv = (TV)factory.getBean("tv");
tv.powerOn();
tv.volumeUp();
tv.volumeDown();
tv.powerOff();
factory.close();
}
}
TVUser.java
다형성 (bean을 ) 결합도 최소!
apple 스피커 사용하고싶음
추출하고자 하는 SonySpeaker 클래스의 이름에 포커스를 주고 Refector - Extract Interface를 선택한다.
Setter Injection 이용하기
Setter 메소드를 호출하여 의존성 주입을 처리하는 방법
Setter 메소드는 스프링 컨테이너가 자동으로 호출한다.
호출하는 지점은 <bean> 객체 생성 직후이다. 따라서 Setter인젝션이 동작하기 위해서 Setter 메소드 뿐 아니라 기본 생성자도 필요하다.
package polymorphism;
public class SamsungTV implements TV{
private Speaker speaker;
private int price;
public void setSpeaker(Speaker speaker) {
System.out.println("setSepaker() 호출");
this.speaker = speaker;
}
public void setPrice(int price) {
this.price = price;
}
public void powerOn() {
System.out.println("SamsungTV---전원 켠다(가격: " + price + ")");
}
public void powerOff() {
System.out.println("SamsungTV---전원 끈다");
}
public void volumeUp() {
//speaker = new SonySpeaker();
speaker.volumeUp();
//System.out.println("SamsungTV---소리 올린다");
}
public void volumeDown() {
//speaker = new SonySpeaker();
speaker.volumeDown();
//System.out.println("SamsungTV---소리 내린다");
}
}
<?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="tv" class="polymorphism.SamsungTV">
<property name="speaker" ref="sony"></property>
<property name="price" value="20000"></property>
</bean>
<bean id="sony" class="polymorphism.SonySpeaker"></bean>
<bean id="apple" class="polymorphism.AppleSpeaker"></bean>
</beans>
<property name="호출하고자 하는 메소드 이름" ref="빈객체 이름"></property>
<property name="호출하고자 하는 메소드 이름" value="기본형 데이터 이름"></property>