控制反转IOC( Inversion of Control )也被称为依赖注入,简单的说,就是通过接口来实现两个类之间的弱引用,由一个第三方容器来专门管理这种依赖,负责实例化并注入接口的实现。
      由于一般都是通过构造函数注入接口的实现,因此也叫构造依赖注入。
      不废话,上代码:
      要求从控制台接收两个输入并分别执行三次求和,业务逻辑很简单。这里我们划分为业务逻辑层Business和调用层也就是应用层Application.

     Setp1:定义接口



1. /**
2.  * 定义业务方法接口
3.  */  
4. public interface IAdd {  
5. public void Add(String a,String b);  
6. public void Add(int a,int b);  
7. public void Add(float a,float b);  
8. }


    Setp2:具体业务类实现接口




1. /**
2.  * IAdd接口的实现,具体业务类
3.  * */  
4. public class Bll implements IAdd {  
5.   
6. public void Add(String a, String b) {  
7. "现在执行字符串连接");  
8.         System.out.println(a+b);  
9.     }  
10.   
11. public void Add(int a, int b) {  
12. "现在执行整形求和");  
13.         System.out.println(a+b);      
14.     }  
15.   
16. public void Add(float a, float b) {  
17. "现在执行浮点求和");  
18.         System.out.println(a+b);          
19.     }  
20. }

 


     Step3: 在业务类的构造函数中注入接口,使用接口的方法。此处是关键,业务类使用的接口方法,从而实现了和具体业务类的松耦合 。



1. import java.io.BufferedReader;    
2. import java.io.InputStreamReader;    
3.   
4. /**
5.  * 构造依赖注入,从外部注入实现类
6.  * 当前类为应用类
7.   */  
8. public class Application {  
9.       
10. private IAdd _IAdd=null;  
11.       
12. public Application(IAdd IAdd)  
13.     {  
14. this._IAdd=IAdd;  
15.     }  
16.       
17. public  void Run()  
18.     {  
19. float first=0,second=0;  
20.           
21. "请输入第一个数字");  
22.           
23. try  
24.         {  
25. new BufferedReader(new InputStreamReader(System.in));  
26.          first= Cast2Float(strin.readLine());  
27. catch(Exception e)  
28.         {  
29. "您的输入有误,请输入数字,程序退出!");  
30. return;  
31.         }     
32.           
33. "请输入第二个数字:");           
34.            
35. try  
36.             {  
37. new BufferedReader(new InputStreamReader(System.in));  
38.              second= Cast2Float(strin.readLine());  
39. catch(Exception e)  
40.             {  
41. "您的输入有误,请输入数字,程序退出");  
42. return;  
43.             }  
44.            
45. //调用字符串连接函数  
46.          _IAdd.Add(String.valueOf(first),String.valueOf(second));  
47.            
48.            
49. //调用整形求和函数  
50. int)first,(int)second);  
51.            
52.            
53. //调用浮点求和函数  
54.          _IAdd.Add(first,second);  
55.            
56.     }         
57.       
58. //对输入进行校验转换,如果转换异常抛出到上一层  
59. private  float Cast2Float(String input)throws Exception  
60.     {  
61. if(input.length()==0){  
62. throw new Exception();  
63.         }  
64. return Float.parseFloat(input);  
65.     }         
66. }   
67.


Setep4:构造第三方容器,由这个容器来负责实例化接口的实现并向应用类注入。在真实应用中,很多框架都包含这种功能,如spring mvc之类的,这类工具称为IOC容器,从而实现各个类之间的解耦。



1. /**
2.  * IOC容器,为应用类Application注入业务接口实现
3.  */  
4. public class IOCContainer {  
5.       
6. public static void main(String[] args)  
7.     {  
8. //实例化IAdd接口的实现  
9. new Bll();    
10. //为应用类注入实现  
11. new Application(bll);  
12. //调用应用类  
13.        app.Run();     
14.     }  
15. }

     至此就完成一个简单的IOC模型。在真实的应用中,依赖控制的容器执行过程要复杂得多,需要很多运行时技术,根据不同的上下文来注入同一接口的不同实现等等。