什么是IOC(DI)机制?
控制反转(Inversion of Control)和依赖注入(Dependecy Injection)是同一个概念,具体的讲:当某个角色
需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者
因此也称为依赖注入。
spring以动态灵活的方式来管理对象; 注入的两种方式,设置注入和构造注入。
详解:控制反转又称为依赖注入,主要为了降低类之间的耦合度,类A依赖类B的时候我们按传统写法就需要在类A里面调用类B对象的方法,而用SPRING的话,就相当于提供了一个接口,在类A里面调用这个接口就可以得到类B对象,不用NEW出类B的对象来。利用接口的原理来降低了耦合度。
而为了实现上述原理,我们把他写成配置文件,然后在程序运行时用反射的方式来加载这个配置文件(用spring时就是用的反射机制运行时调用),找到要使用的类,并由spring给你生成对象。控制反转,就是交换控制权的意思,比如我类A需要用到类B的时候,具体的实现方式是在类B的某个方法里,也就是说类B控制着这个业务的具体实现。而现在用IOC以后,类B交出控制权,类A来进行控制,类A里只需要调用一个接口的方法,不管你这个方法的具体实现是由类B的对象来实现,还是由其他类的对象来实现,反正类A调用这个接口的这个方法就可以搞定他需要实现的业务内容,这样一来,类A它看上去就得到了实现某个业务的控制权。而依赖注入这个词则体现得更加专业一点,就是讲在我的程序里,我从来不去构造(new HelloWorld()这样的方法)任何对象,只是在需要用到(也就是依赖)某个对象的时候,我就用spring给他注入这个对象。这个注入的方式也就降低了程序的耦合度
举个简单的例子 某些项目中,涉及到人的都有名字属性。那么绝大部分时候,我们会这样设计程序 class Person { //一些字段或方法 } class Ma { private Person person= new Person(); //自己实例化 Person类 public void save(Person person) {
person.execute(); }
} 即要储存一个人的信息,要管理者实例化一个Person类。 而IOC的意思就是我们Person实例,这时候实例已经创建,我们去取就可以,不用自己实例. class Ma { private Person person = springFactory.getBean("person"); public void svae(Person person) { name.execute(); } } 这些axe就是在spring的配置文件里声明的bean.
什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为spring支持用户自定义的切面和面向切面编程提供声明式事务管理
和meta-program有关系,meta-program就是用代码生成代码。
当应用分层了以后,你可能发现某些功能是贯穿于每层的(比如捕获异常、日志输出等),就像一个个切片(Pointcut)一样。我们说一个方法一次只做一件事并把他做好,但是往往我们的方法中会有捕获异常、日志输出这样的逻辑与业务逻辑混杂。所以高人们就用meta-programming来将这些逻辑放在应该放的地方。
当应用分层了以后,你可能发现某些功能是贯穿于每层的(比如捕获异常、日志输出等),就像一个个切片(Pointcut)一样。我们说一个方法一次只做一件事并把他做好,但是往往我们的方法中会有捕获异常、日志输出这样的逻辑与业务逻辑混杂。所以高人们就用meta-programming来将这些逻辑放在应该放的地方。
说通俗点就是将共通的部分抽象出来,单独实现,然后切入到你想执行的地方。举个例子吧!
把类当做一条直线,java开发讲究的是低耦合,低耦合到极限的时候就是线与线都是平行的,无任何交叉,交叉就代表着依赖。有一个共通的操作要在所有平行线上执行,这样就产生了交叉。AOP的功能就是将这条交叉的线独立出来,人为的放置平行,但功能还是原来的功能!
把类当做一条直线,java开发讲究的是低耦合,低耦合到极限的时候就是线与线都是平行的,无任何交叉,交叉就代表着依赖。有一个共通的操作要在所有平行线上执行,这样就产生了交叉。AOP的功能就是将这条交叉的线独立出来,人为的放置平行,但功能还是原来的功能!
举例:
AOP是面向切面编程,简单点解释,比方说你想在你的Service层所有类中都加上一个打印‘hello world’(实际操作中可能是日志、日常等)的功能这你经可以用aop思想来做,你先写个类写个方法,方法经实现打印‘hello world’让后你Ioc这个类 ref=“Service.*”让每个类都注入。