spring 控制反轉和依賴注入的簡單理解
阿新 • • 發佈:2019-02-05
最近在學習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,要使用的時候將需要注入的實體注入即可。