控制反转(IoC)-解析与实现
控制反轉(Inversion of Control)縮寫:IoC是面向對象編程中框架級別里的一個重要的概念,
可以說Spring框架的核心就是基于IoC原理的。
這個概念到底是什么呢?
這么講吧,一個系統的運作肯定不是簡單的幾個類就可以實現的,它往往需要多個類的合作來實現業務邏輯
。這就使得每個對象都需要與其合作的對象具有相互的關系(依賴關系)。在早前編程中所需要的依賴對象
是通過自身去創建得到的,而現在是通過一個容器來統一管理這些依賴關系。在這整個過程中,對象獲得其他對象引用的方式其實就是IoC。
IoC的本質是什么?
控制權的轉移。IoC原理是基于面向對象中的設計原則的The Hollywood Principle:Don't call us,we'll call you(別找我,我會來找你的)。
可以這樣講,所有組件的初始化和調用都是由容器負責。在傳統實現中類之間的關系是由類自己控制的(需要使用其他類時就自己創建),
但是在IoC中,組件處在容器中,由容器統一管理和調度。這就是"控制反轉"的概念所在:控制權由應用代碼轉移到了容器中,即控制權的轉移。
那如何實現IoC這種思想的呢?
實現IoC思想的方式主要有兩種:依賴注入和依賴查找。
下面就以依賴注入為例講解一下:
1 1.先定義一個部門接口:
2
3 public interface IDepartService {
4 //通過員工編號獲得部門名字
5 public String getDepartNameByUser(int userId);
6 }
7
8 2.實現該接口:
9 public class DepartServiceImpl implements IDepartService {
10
11 @Override
12 public String getDepartNameByUser(int userId) {
13 if(userId==1){
14 return "IT部門";
15 }
16 return "";
17 }
18 }
19 3.定義一個用戶類,該類中要維持部門對象的引用:
20
21 public class UserServiceImpl {
22 private IDepartService departService;
23
24 public void printInfo(int userId){
25 System.out.print(getUserName(userId));
26 System.out.println(departService.getDepartNameByUser(userId));
27 }
28
29 public String getUserName(int userId){
30 if(userId==1){
31 return "張三 ";
32 }
33 return "";
34 }
35 }
在用戶類中,我們沒有看到關于創建DepartService對象的語句。這里面我們沒有采用常見的set注入或者構造方法注入,
而是采用反射的方法直接注入并執行的,要實現這個效果的話,我們需要定義一個容器,來管理他們的關系。
4.定義容器,我們在容器中先獲取配置文件:
public class Container {
......
private void loadConfig() {
// TODO Auto-generated method stub
InputStream is = Container.class.getResourceAsStream("/ioc.properties");
properties = new Properties();
try {
properties.load(is);
} catch (Exception e) {
// TODO: handle exception
}
}
public Object get(String name) {
String className = (String) properties.get(name);
return Class.forName(className).newInstance();
......
}
public void inject(Object obj) {
Field[] fields = obj.getClass().getDeclaredFields();
......
for (Field field : fields) {
field.setAccessible(true);
field.set(obj, get(field.getName()));
}
......
}
}
在上述中,首先獲取配置文件中已配置好的依賴關系,然后采用反射技術根據依賴關系進行創建相應的對象
5.其中ioc.properties的內容為:
departService=com.service.impl.DepartServiceImpl
6.查看入口方法:
public static void main(String[] args) {
UserServiceImpl user=new UserServiceImpl();
Container container=new Container();
container.inject(user);
user.printInfo(1);
}
7.查看結果:
總結:可以說IoC這個思想是一個很偉大的思想,現在很多大神甚至將它歸為GoF中(因為IoC出現的比較晚,錯過了GoF“四人組”的《Design Patterns: Elements of Reusable Object-Oriented Software》)。
總結
以上是生活随笔為你收集整理的控制反转(IoC)-解析与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]linux援救模式:linux r
- 下一篇: 枕头有多高?采用枕头高度