控制反转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模型。在真实的应用中,依赖控制的容器执行过程要复杂得多,需要很多运行时技术,根据不同的上下文来注入同一接口的不同实现等等。