날아라쩡글이의 블로그입니다.
의존성 주입의 수동 주입 방법 본문
728x90
반응형
의존성 주입의 수동 주입 방법
- setter
- setter injection(setter메소드를 이요한 의존성 주입)
- 의존하는 객체를 담는 멤버변수를 정의한다.
- 멤버변수 갯수만큼 setter메소드를 정의한다.
- 스프링 bean설정파일에서 <property />태그를 이용해서 의존하는 객체를 주입시킨다.
- <bean id="userServiceImpl" class="com.sample.service.UserServiceImpl"></bean>
<bean id="setterController" class="com.sample.controller.SampleSetterController">
<property name="productService" ref="productServiceImpl"></property>
//name : setter메소드이름, ref:setter메소드의 매개변수로 전달되는 객체의 빈 아이디
<property name="userService" ref="userServiceImpl"></property>
</bean>- public class SampleController{
//의존성 주입을 통해서 전달받은 객체를 저장하는 변수
UserService userService; //멤버변수의 타입은 의존성 주입을 받는 객체의 부모타입이다.
ProductService productService;
//의존하는 객체를 전달받을 setter메소드
public void setUserService(UserService userService){this.userService = userService }
public void setProductService(ProductService productService){this.productService=productService}
}
- public class SampleController{
- setter injection(setter메소드를 이요한 의존성 주입)
- setter/ namespaces에서 p로 설정
- <bean id="setterController" class="com.sample.controller.SampleSetterController"
p:productService-ref="productServiceImpl"
p:userService-ref="userServiceImpl"></bean> - <property name="setter메소드이름" ref="스프링 컨테이너에 보관중인 객체의 아이디" />
대신 Namespaces에서 p를 클릭하고, xmlns:p="http://www.springframework.org/schema/p가 추가된 후
p:setter메소드이름-ref="스프링 컨테이너에 보관중인 객체의 아이디"로 설정해도 setter의존성 주입이 이뤄진다. - setter메소드에 한해서 작성할 수 있다.
setter메소드만 존재 : 기본자료형만 온다.
setter메소드 -ref : 객체가 온다.
- <bean id="setterController" class="com.sample.controller.SampleSetterController"
- constructor
- 생성자 메소드를 이용해서 의존성 주입을 받는 방식이다.
- 의존성 주입을 받는 객체에는 반드시 <constructor-arg />태그의 갯수가 동일한 매개변수를 갖는 생성자가 정의되어 있어야한다.
- <bean id="sampleController" class="com.sample.controller.SampleConstructorController">
<constructor-arg name="productService" ref="productServiceImpl"></constructor-arg>
<constructor-arg name="userService" ref="userServiceImpl"></constructor-arg>
</bean>
//name : 생성자 메소드의 매개변수 이름, ref : 생성자 메소드의 해당하는 매개변수로 전달되는 객체의 빈아이디 - <constructor-arg /> 태그가 하나도 없는 경우 기본생성자를 이용한 경우다.
- 반드시 해당 클래스에 기본 생성자 메소드가 존재해야한다.
- 기본생성자가 존재하지 않으면 error가 난다.
- <constructor-arg />의 갯수와 매개변수의 갯수가 동일한 생성자 메소드가 반드시 클래스에 존재해야하며, 타입도 일치해야한다.
- public class SampleController{
//의존성 주입을 통해서 전달받은 객체를 저장하는 변수
UserService userService; //멤버변수의 타입은 의존성 주입을 받는 객체의 부모타입이다.
ProductService productService;
//의존하는 객체를 전달받을 생성자 메소드
public void setProductService(ProductService productService, UserService userService){
this.productService=productService;
this.userService = userService;
}
}
- constructor / namespaces에서 c로 설정
- <bean id="sampleController" class="com.sample.controller.SampleConstructorController"
c:productService-ref="productServiceImpl"
c:userService-ref="userServiceImpl"></bean> - <constructor-arg name-"생성자의 매개변수이름" ref="스프링 컨테이너에 보관중인 객체의 아이디"/>대신 c:생성자의 매개변수 이름-ref = "스프링컨테이너에 보관중인 객체의 아이디"로 설정해도 생성자 의존성 주입이 이뤄진다.
- <bean id="sampleController" class="com.sample.controller.SampleConstructorController"
- 객체 타입
- 스프링 컨테이너가 생성/보관/조립하는 객체를 말한다.
- <bean id="빈의 아이디" class="클래스전체경로">
<property name="setter메소드이름" ref="빈의 아이디">
</bean> - 객체를 조립하기위해서는 spring Container로 조립이 되야한다. 그렇지 않으면 조립할 수 없다.
- <bean />태그나 지정된 패키지를 스캔해서 스프링 컨테이너에 등록된 객체이다.
- 다른 객체를 조립될 때 ref속성을 사용한다.
- collection
- 이전까지는 객체를 1개를 입력받았다. 이제는 객체 한개가 아니라 여럿을 입력받는 방법을 작성할 예정이다.
- 스프링 컨테이너가 생성한 객체를 collection(배열 String[] urls, set Set<MessageService> messageServices, List List<ExceptionHandler> exceptionHandlers)에 저장된 형태로 주입받도록 멤버변수를 정의한다.
- 기본자료형 값이나 스프링 컨테이너가 생성/보관/조립하는 객체를 여러개 저장하고 있는 객체를 말한다.
- setter 주입, constructor 주입을 통해서 의존성 주입이 가능하다.
- public class SampleCollectionController {
private Set<MessageService> messageServices;
public void setMessageServices(Set<MessageService> messageServices) {
this.messageServices = messageServices;
}
public void setUrls(String[] urls urls){this.urls = urls};
public void setExceptionHandlers(List<ExceptionHandler>){this.exceptionHandlers = exceptionHandlers};
}
- private Set<MessageService> messageService;
- messageServices객체가 여러 개 저장된 Set구현객체를 주입받도록 정의되어 있기 때문에
<set> : set에 정의된, 배열이면 array, 리스트면 list로 변경해주면 된다.
<ref bean="빈의 아이디" />
<ref bean="빈의 아이디" /> : bean의 아이디에 해당하는 것
<ref bean="빈의 아이디" />
</set>
과 같은 형태로 정의해서 빈의 아이디에 해당되는 객체가 3개 저장되어 있는 Set구현객체를 생성해야 한다. -
<bean id="sampleController" class="com.sample.controller.SampleCollectionController">
<property name="messageServices">
<set>//아래의 값을 담을 Set구현객체를 생성시킨다.
<ref bean="sms"/>
<ref bean="email"/>
</set>
</property>
<property name="exceptionHandlers">
<list>//아래의 값을 담을 List구현객체를 생성시킨다.
<ref bean="runtimeExceptionHandler" />
<ref bean="DataAccessExceptionHandler" />
</list>
</property>
<property name="urls">
<array> //아래의 값을 담을 배열객체를 생성시킨다.
<value>http://www.daum.net</value>//문자열이라 기본자료형인 value로 담는다
<value>http://www.naver.com</value>
</array>
</property>
</bean>
- map
- 기본자료형 값이나 스프링 컨테이너가 생성/보관/조립하는 객체를 key, value의 쌍으로 여러개 저장하는 객체를 말한다.
- 조건식의 상수값을 Map객체의 key로 활용하면 조건식(if~else if)을 없앨 수 있다.
- 상수값으로 꺼내와서 사용하면 된다.
- map이다.
- MessageService인터페이스 구현객체가 key, value쌍으로 저장되는 Map객체를 스프링 컨테이너로 부터 주입받는다.
- Map객체에는 {"sms" : SmsMessageImpl, "email":EmailMessageServiceImpl}과 유사한 형태로 MessageService인터페이스의 구현객체들이 저장되어 있다.
- public class SampleController{
Map<String, MessageService> messageService;
public void setMessageService(Map<String, MessageService> messageService) {
this.messageService = messageService;
}
public void execute(String key, String message){
MessageService service = messageService.get(key);
service.send(message);
}
} - <bean id="sampleController" class="com.sample.controller.SampleMapController">
<map>
<entry key="key" value-ref="MessageService구현객체의 빈 아이디"></entry>
</map> - <property name="messageService">
<map>
<entry key="sms" value-ref="smsService"></entry>
<entry key="email" value-ref="emailService"></entry><!-- 키와 value의 한쌍을 entry라고 부른다. -->
</map>
</property>
</bean>
- value:기본자료형 사용
- 정수, 실수, 불린형, 문자열 등이다.
- 다른 객체에 조립될 때 value속성을 사용한다.
- <property name="setter메소드이름" value="기본자료형값">
- public class SampleController{
private String host;
private int port;
public void setHost(String host){this.host = host}
public void setPort(int port){this.port = port} - <bean id="sampleController" class="com.sample.controller.SampleValueController">
<property name="host" value="192.168.10.2"></property>
<property name="port" value="3000"></property>
</bean> - <bean id="sampleController" class="com.sample.controller.SampleValueController"
p:host="192.168.10.2"
p:port="3000"> //기본형은 -ref를 붙이지 않아도 된다.
</bean>
반응형
'중앙 HTA (2106기) story > spring java framwork story' 카테고리의 다른 글
DB Access 방법 (CRUD) (0) | 2021.12.28 |
---|---|
느슨한 결합, DB 연결 (0) | 2021.12.27 |
spring framwork설명 (0) | 2021.12.27 |
의존성 주입 (DI) 자동 주입 (0) | 2021.12.27 |
전자전부표준프레임워크 (0) | 2021.12.27 |
Comments