IOC和DI,AOP的本质理解
IOC: Inversion of Control,控制反转, 控制权从应用程序转移到框架(如IOC容器),是框架共有的特性。
对于IOC的理解,可以把IOC看作是一个生产和管理bean对象的容器。原本程序中我们要手动自己创建(new)的对象统统交给Spring的IOC容器帮我们创建。同时这就意味着,要产生的单例的bean,这个对象的生命周期也是有IOC容器管理。
Spring中IOC的三种实现方式:
1.属性注入,或叫做set方法注入;
2.构造方法注入;
3.注解注入,可能因为方便的原因,这种方式免去了臃肿的配置,所以比较常用。
Spring的有点主要是根据IOC和AOP实现的,之前有简单提到AOP的实现思想,这些都是针对工厂模式和代理模式的友好封装。IOC主要解决了代码的高度耦合问题,AOP将面向切面的编程思想做出了最好的解释和应用。
这里顺带简单解释一下Spring中的IOC,DI,AOP:
IOC就是控制反转,通俗的说就是我们不用自己创建实例对象,这些都交给Spring的bean工厂帮我们创建管理。这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。这就意味着IOC是Spring针对解决程序耦合而存在的。在实际应用中,Spring通过配置文件(xml或者properties)指定需要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法(getBean())就可以获取到我们想要的根据指定配置进行初始化的实例对象。
AOP就是将程序功能中的频繁出现或者与主业务逻辑代码相关度不高的代码抽离出来,通过切面编程的方式在想要调用的时候引入调用的思想。而这种思想并不是只限于Spring和java,AOP(面向切面)和OOP(面向对象)一样都是一种编程思想,这种思想的实现机制在Spring中便是应用了java的动态代理和java的反射。在实际编程中,我们通常会遇到一些交叉业务逻辑(比如:日志,事务,安全等等),这是我们就可以封装一个封面,然后注入到目标对象(具体的业务逻辑)中去。ps:很多方法都会抛出异常信息,这是我们就可以写一个拦截器,在这个类中实现记录错误日志的功能,再在Spring的xml配置文件中配置一个对这些要记录日志的方法的AOP拦截器,在这个方法执行后调用这个拦截器来记录日志。这样就不用每次抛出异常都要手动的去单独处理记录,提高了程序的内聚性。这种在调用某个方法之前/后想要自动执行一系列自定义操作的就是AOP思想。
总结:
IOC即控制反转,一种将控制权转移的设计模式,由传统的程序控制转移到容器控制;
DI即依赖注入,将相互依赖的对象分离,在Spring的配置(注解)中描述它们之间的依赖关系,这些依赖关系也只在使用时才被建立。
AOP即面向切面,一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。
Spring的AOP和IOC都是为了解决代码的耦合度的实际应用,使得代码的重用度变高,便于维护。但这些都不是Spring中特有的,我们可以说Spring将它们应用的更灵活。
引用前者:络庆钟朔