일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 긴문자열
- 리눅스
- jsonview
- cutomobjectmapper
- 마이바티스
- 윈도우
- 캐릭터셋
- 마리아DB
- AOP
- mybatis
- git
- db admin
- marketplace
- 버전
- 일정계획
- 제어역전
- Eclipse
- 루팅
- SVN
- 설정파일
- 스프링
- Version
- dbeaver
- NoClassDefFoundError
- 이클립스
- ㅗ르
- Spring
- 생략
- 의존성주입
- ResponseBody
- Today
- Total
프밍일기
DI(Dependency Injection, 의존성주입) 본문
■ DI(Dependency Injection, 의존성 주입)
- 빈(Bean)이 외부로부터 의존관계가 성립되는 객체를 인자로 넘겨받아 처리하는것.
- 의존관계 설정을 컴파일 시점이 아니 실행 시점에 결정한다.
- 의존관계 설정이 실행 시점에 결정되기 위해서는 넘겨받는 인자가 특정 클래스(Class)가 아닌 인터페이스(Interface) 이어야 한다.
- 메소드가 사용하는 인자를 인터페이스로 설정 함으로써 인터페이스를 구현하기만 하면 다양한 object를 받아서 일관된 동작을 할 수 있도록 정의한다.
■ 어노테이션(Annotation)을 이용한 DI
[ ConnectionMaker.java ] public interface ConnectionMaker { public Connection makeConnection() throws ClassNotFoundException, SQLException; }
[ UserDao.java ] public class UserDao { private ConnectionMaker connectionMaker; public UserDao(ConnectionMaker connectionMaker) { this.connectionMaker = connectionMaker; } }
[ DaoFactory.java ] @Configuration public class DaoFactory { @Bean public UserDao userDao() { return new UserDao(connectionMaker()); } @Bean public ConnectionMaker connectionMaker() { return new NConnectionMaker(); } }
- UserDao.java 에서 생성자가 ConnectionMaker 라는 인터페이스형을 인자로 설정함으로써 이 인터페이스를 구현한 어떤 object라도 넘어올 수 있으며 어떤 object인지는 실행시에 결정됨.
- ConnectionMaker 인터페이스를 인자로 넘겨받아 사용하는 userDao() 메소드도 빈(Bean)이어야 DI가 성립한다.
■ XML을 이용한 DI
<?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-3.0.xsd"> <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> <property name="driverClass" value="org.mariadb.jdbc.Driver"></property> <property name="url" value="jdbc:mariadb://localhost:3306/dynaboard"></property> <property name="username" value="user_name"></property> <property name="password" value="user_password"></property></bean> <bean id="userDao" class="com.fannell.board.dao.UserDao"> <property name="dataSource" ref="dataSource"></property></bean> </beans>
# beans : 빈 설정 root. 어노테이션의 @Configuration에 해당.
# bean : 빈 설정 항목. 어노테이션의 @Bean에 해당
- id : 메소드명
- class : 주입되는 구현클래스
# 7) property : 리턴될 빈의 속성값 설정. 여기서는 SimpleDriverDataSource 객체의 멤버
- name : set을 뺀 메소드명
- value : set메소드에 넘겨질 값
# 12) property : 7라인 property와 동일.
- ref : 주입된 다른 빈(Bean) 객체. 여기서는 6라인의 객체
# 7라인에서 dirverClass 수정자는 원래 java.lang.Class 타입을 받는다. 스프링은 설정된 값을 메소드의 파라미터 타입을 참고하여 적절한 형태로 변환해줌.
■ Constructor Injection
스프링 컨테이너는 XML 설정 파일에 등록된 클래스의 객체 생성시 기본적으로 매개변수가 없는 Default 생성자를 호출한다. 매개변수를 이용하는 생성자를 호출하려고 할때는 constructor-arg 항목으로 선언한다.
<bean id="tv" class="com.fannell.site.polymorphism.SamsungTV"> <constructor-arg ref="apple"></constructor-arg> <constructor-arg value="2700000"></constructor-arg> </bean>
- ref : 참조형(object type) 파라미터 일때
- value : 기본형(primitive type) 파라미터 일때
'Spring' 카테고리의 다른 글
Spring과 MyBatis 연동 예제 (2) | 2017.04.07 |
---|---|
AOP - Annotation (0) | 2017.03.24 |
AOP - XML (0) | 2017.03.24 |
스프링 컨테이너 <beans> 설정 유의사항 (0) | 2017.03.03 |
IoC(Inversion of Control, 제어역전) (0) | 2017.01.28 |