Dependency Lookup
컨테이너가 lookup context를 통해 필요한 Resource나 Object를 얻는 방식
관련된 코드를 만들어야 하고, 형변환, 익셉션 처리도 해주어야 함
Dependency Injection
컨테이너가 직접 의존 구조를 Object에 설정 할 수 있도록 지정(xml, annotaion)
Object가 컨테이너의 존재 여부를 알 필요가 없음. Lookup 관련 코드 필요없음.
객체의 생성, 사용, 소멸에 해당하는 라이프 사이클을 담당
기능: 라이프사이클 관리, Dependency 객체 제공
서비스 객체를 사용하기 위해 Factory 또는 Singleton 패턴을 직접 구현하지 않아도 됨
오브젝트의 생성/관계설정/사용/제거 등의 작업을 코드 대신 독립된 컨테이너가 담당.
오브젝트에 대한 제어권을 가지고 있음
스프링 컨테이너 = IOC 컨테이너
스프링에서 IOC를 담당하는 컨테이너에는 BeanFactory, ApplicationContext가 있음.
BeanFactory: 객체(Bean)을 만드는 공장
ApplicationContext: BF 하위클래스, Application를 관리하는 context, 메모리의 영역
Spring DI Container가 관리하는 객체를 Bean이라 하고 이 Bean들의 생명주기를 관리하는 의미로 BeanFactory라고 한다.
BeanFactory에 여러가지 컨테이너 기능을 추가하여 ApplicationContext라고 한다.
일반적으로 ApplicationContext 사용.
단계별 결합도
1. 클래스 호출 방식: 객체간 강한 결합, 구현되어 있기 때문에 변화 불가능
2. 인터페이스 호출 방식: 다형성을 통해 결합도 낮춤, 인터페이스 교체 시 호출 클래스도 수정
3. 팩토리 호출 방식: Factory를 통해 결합도 낮춤, 팩토리에 의존함
4. IoC 호출 방식: 팩토리 장점에 더해 어떠한 것에도 의존하지 않음. 런타임에 클래스 간의 관계 형성
ApplicationContext 객체가 필요함.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<bean id = "kor" class = "com.ssafy.hello.di4.HelloMessageKor">
</beans>
xml 설정
public class HelloMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("xml위치");
//객체 생성
HelloMessage helloMessage = context.getBean("kor", HelloMessageKor.class);
//이름, 클래스
}
}