1. 程式人生 > >spring 控制反轉和依賴注入的簡單理解

spring 控制反轉和依賴注入的簡單理解

最近在學習springboot的時候發現我對spring不能抽象說出意思,證明當時並沒理解spring只是限於使用,對於剛踏入這行的畢業生這是不行的,為了養成良好的習慣,堅持將工作中的問題總結髮成部落格供自己觀看哈哈。

現在來看一個例子:

建立了一個functionservice類

public class FunctionService {

	public String sayHello(String word) {
		return "hello"+word;
	}
	
}

接下來我要使用這個方法

/**
 * @author pm_WeiYu
 *	functionservice 是此類的依賴
 */
public class UserFunctionService {
	
	FunctionService fs=new FunctionService();
	
	@Test
	public void log() {
		fs.sayHello("aaa");
	}
}

這時候可以稱userfunctionservice 要依賴 functionservice。

但這樣的程式碼我們可以發現耦合性很高,舉個例子就是我們(userfunctionservice)要去市場(functionservice)買菜(sayhello),我們需要去不同的市場買不同的菜,這時候如果有個電商平臺可以將這些資源整合起來,那我們直接去電商平臺(spring)購買就行了。這就把控制權交給了spring(控制反轉IOC)把菜的資訊(實體bean)注入(DI)給我們(userfunctionservice)供我們使用。這樣我們需要買菜去電商平臺下單就行了。

接下是spring的做法(spring4.x 通過java類配置檔案)

加註釋service,這裡可以選擇@component @service @Repository @Controller

@Service
public class FunctionService {

	public String sayHello(String word) {
		return "hello"+word;
	}
	
}

編寫一個配置類

/**
 * @author pm_WeiYu
 * spring配置類
 */

@Configuration
@ComponentScan("god.demo.service")
public class DiCongifg {

}

需要注入的類

/**
 * @author pm_WeiYu
 *	functionservice 是此類的依賴
 */

public class UserFunctionService {
	@Autowired
	FunctionService fs;
	
	@Test
	public void log() {
		AnnotationConfigApplicationContext acac=new AnnotationConfigApplicationContext(DiCongifg.class);
		FunctionService bean = acac.getBean(FunctionService.class);
		System.out.println(bean.sayHello("aaa"));

	}
}

使用關鍵字@Autowired將實體注入到其中具備其功能。

在這裡需要注意一下,spring-cord 4.0.2版本以上使用AnnotationConfigApplicationContext會找不到。

可以看見現在建立物件的權力交給了spring,要使用的時候將需要注入的實體注入即可。