制作网站书签怎么做网上互联网推广
我之前面试的时候,真的会有面试官问这个。我感觉确实这个比较高频,因为 Spring 框架最核心的就是这两个东西嘛,掌握了这两个就相当于掌握了 Spring 的半壁江山了。
不过一般面试官不会一上来就问你什么是 AOP 和 IOC,一般都是叫你谈谈 Spring,这时候你就可以从这两个东西去谈了。之前对于这个题目我回答的不算好,所以今天花时间整理了一下应该如何回答。
IOC 就是控制反转,其实本来是程序员自己再代码中new对象的,现在交给Spring的IOC容器去创建了。对象的创建这样一个行为从程序员反转到了IOC容器。事实上,IOC只是一种思想而已,这种思想是通过依赖注入实现的。
我们知道每个类中都有很多个对象,而每个类其实都是互相有联系的,因为只有类与类之间互相有联系,才可以实现更强大的功能。由于类之间互相有联系,则不同类的对象很可能也是互相关联的。假如在一个类中创建一个对象A,这个对象A引用了另一个类的对象B,那A和B就紧耦合了。我们肯定不希望这样子写代码,因为这样写出来的代码太糟糕了,你一旦对其中一个对象做点啥,另一个对象就要跟着动代码,那这是我们不希望看到的。
而我们在做项目的时候,比如controller层,service层,dao层这种,你不会看到controller,service层会new一个对象出来,因为它们将创建对象的代码交给了Spring IOC去做了,如果controller层想要用service层的功能的时候,controller就会用@autowired注入service层的一些对象,就像打针一样注入给controller层,这样controller层就会使用service层的功能了。同时,因为我们将创建对象的代码放到了Spring IOC容器中,controller层和service层实现了解耦,这样代码的可维护性就会很强。
所以说,Sping中用了依赖注入的方式实现了控制反转的思想,使得不同类的对象之间能够共同完成复杂的功能的同时,还保证了松耦合。
而AOP其实也是一种设计思想,我的理解是在功能模块的业务代码的方法前后加上一些重复性的非代码模块(比如日志/事务/安全代码) 。通过AOP,我们就可以在不改变业务代码的情况下,对功能进行增强(比如给某个功能增加事务支持,安全支持之类的)。