두 가지 예를 통해 이해하려고 노력하겠습니다.
실시 예 1
이전에는 앱이 사용자 입력을 하나씩 받아들이도록 명령 프롬프트를 생성하는 데 사용되었습니다. 오늘날 UI 프레임 워크는 다양한 UI 요소를 인스턴스화하고 해당 마우스 요소 (마우스 호버, 클릭 등)의 다양한 이벤트를 반복하며 사용자 / 주 프로그램은 이러한 이벤트를 청취하기위한 후크 (예 : Java의 UI 이벤트 리스너)를 제공합니다. 따라서 기본 UI 요소 흐름 "제어"는 사용자 프로그램에서 UI 프레임 워크로 이동합니다. 초기에는 사용자 프로그램에있었습니다.
실시 예 2
CustomerProcessor
아래 수업을 고려하십시오 .
class CustomerProcessor
{
SqlCustRepo custRepo = new SqlCustRepo();
private void processCustomers()
{
Customers[] custs = custRepo.getAllCusts();
}
}
에서 제공하는 것뿐만 아니라의 processCustomer()
구현과 독립적으로 하고 싶다면 줄을 제거해야합니다. 다양한 유형의 구현을 받아 들일 수있는보다 일반적인 것으로 대체해야 합니다. 제공된 구현. 위의 코드 ( 주 프로그램 논리에 의해 필요한 클래스 를 나타냄)는 전통적인 방법이며의 구현에서 분리의 목표를 달성하지 못합니다 . 제어의 역전에서 컨테이너는 필요한 구현 클래스 (xml 구성으로 지정된대로)를 인스턴스화하고 지정된 후크마다 (예 : 스프링 프레임 워크의 주석 또는 메소드로) 바인딩되는 기본 프로그램 논리에 삽입합니다 .getAllCusts()
SqlCustRepo
SqlCustRepo custRepo = new SqlCustRepo()
processCustomers()
SqlCustRepo
processCustomers()
getAllCusts()
@Autowired
getBean()
이것이 어떻게 이루어질 수 있는지 봅시다. 아래 코드를 고려하십시오.
Config.xml
<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-2.5.xsd">
<bean id="custRepo" class="JsonCustRepo" />
</beans>
CustRepo.java
interface ICustRepo
{ ... }
JsonCustRepo.java
class JsonCustRepo implements CustRepo
{ ... }
App.java
class App
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("Config.xml");
ICustRepo custRepo = (JsonCustRepo) context.getBean("custRepo");
}
}
우리는 또한 가질 수 있습니다
class GraphCustRepo implements ICustRepo { ... }
과
<bean id="custRepo" class="GraphCustRepo">
App.java를 변경할 필요가 없습니다.
컨테이너 (스프링 프레임 워크) 위에 xml 파일을 스캔하고 특정 유형의 Bean을 인스턴스화하고 사용자 프로그램에 삽입해야 할 책임이 있습니다. 사용자 프로그램은 어떤 클래스가 인스턴스화되는지 제어 할 수 없습니다.
추신 : IoC는 일반적인 개념이며 여러 가지 방법으로 달성됩니다. 위의 예는 의존성 주입으로 달성합니다.
참조 : Martin Fowler의 기사 .