背景
最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能。Java语言自带的注解特性为IoC和DI带来了极大的方便,要在OC上较好的实现这两个功能,需要一些小小的技巧。
控制反转和依赖注入
控制反转
简单来说,将一个类对象的创建由手动new方式改为从IOC容器内获取,就是一种控制反转,例如我们现在要创建一个ClassA类,则常规方法为
ClassA *a = [ClassA new];
如果使用控制反转,则从容器内获取ClassA对象,对象由容器负责创建。
ApplicationContext *context = [ApplicationContext sharedContext];
ClassA *a = [context getInstanceByClassName:@"ClassA"];
依赖注入
所谓依赖注入,是指一个类对象不应负责去查找其依赖属性,而是交由容器去处理。例如ClassA类有一个ClassB类对象,如下所示。
@interface ClassA : NSObject
@property(nonatomic, strong) ClassB *b;
@end
常规情况下,要将ClassB的对象创建后传递给ClassA,如下所示。
ClassA *a = [ClassA new];
ClassB *b = [ClassB new];
a.b = b;
如果交由容器处理,则容器会自动创建ClassA、ClassB,并且根据ClassA的依赖属性类型ClassB自动的将ClassB的实例注入到ClassA对象中。
优点
使用控制反转和依赖注入将对象的创建与依赖对象的注入交由IoC容器来完成,这样做不仅能够降低代码的耦合度,更可以减少代码量。
类与属性的修饰
这两个功能都是在运行时通过反射来实现的,具体的容器技术细节在下文讨论,这里主要讨论的是如何修饰交由容器创建的对象以及依赖注入的属性。
Java中的注解
在Java中,那些要交由Spring容器创建的类通过注解来修饰,例如JavaWeb中的Controller和Service分别由@Controller和@Service修饰,如下所示。
// 控制器
@Controller
public class SomeController {
...}
// 服务
@Service
public class SomeService {
...