IOC 和 AOP 是Spring的两大核心思想,那么这种技术的实现方式和核心思将又是什么呢?
首先,我们知道Spring是一个分层的轻量级开源框架,大量的配置文件是不可缺少的,但是其核心是要把这些配置文件给组合起来,并将核心代码与业务代码剥离开来.
一 、Spring IOC (控制反转)
IOC (即 Inversion of Control)为控制反转.Spring开发的基本思想 : 采用面向接口的编程模式.框架做到越多,就越有体会接口在起中起的作用,而Spring将这一想法,开始贯彻到业务的开发中.Bean的Set方法使用接口作为参数,保证其扩展性,实现依赖关系的解耦合.所谓的控制反转,也可以理解为依赖注入,IOC容器就是具有依赖注入功能的容器,IOC容器负责实例化、定位、配置应用程序中的对象及监理这些对象间的依赖.程序将无需直接在代码中new相关对象,程序将由IOC容器进行组装.
简单点说,就是将创建对象的控制权,被反转到了Spring框架上. 通常,我们实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工交给了Spring容器。
IOC主要实现方式有两种 : 依赖查找 、 依赖注入 . 依赖注入是一种更可取的方式.
依赖查找,主要是容器为组件提供一个回调接口和上下文环境。这样一来,组件就必须自己使用容器提供的API来查找资源和协作对象,控制反转仅体现在那些回调方法上,容器调用这些回调方法,从而应用代码获取到资源。
依赖注入,组件不做定位查询,只提供标准的Java方法让容器去决定依赖关系。容器全权负责组件的装配,把符合依赖关系的对象通过Java Bean属性或构造方法传递给需要的对象。
二 、DI (依赖注入)
由IOC容器动态将某个对象所需要的外部资源 (包括对象 、资源 、 常量 、)注入到组件(Controller 、 Service 等) 之中 . 简单说,就是IOC容器会把当前对象所需要的外部资源动态的注入给我们 .
Spring依赖注入的方式主要有四种,基于注解注入方式、set注入方式 、 构造器注入方式 、 静态工厂注入方式 . 推荐使用注解注入方式,配置扫,比较方便.
基于注解注入方式 :
服务层 :
控制层 :
@Autowired与@Resource都可以用来装配Bean,都可以写在字段、setter方法上 区别是 :
@Autowired注解:
默认是以类型注入,需要结合@Qualifier(“名称”)才可以按照名称注入,默认必须装配requred=true,如果可以为null,可以设置为false ,例 : @Autowired(required=false)
@Resource注解:
默认是按照名称进行注入,名称可以通过name属性来指定.如果没有指定name参数/Type参数,当注解写在字段上时,则默认找字段名称装配; 如果注解写在setter方法上,默认取属性名进行装配 ,当找不到与名称相匹配的Bean时,则按类型装配,找不到则报错。但是,如果name属性一旦指定后,就只会按照名称进行装配.
三、 Spring AOP (面向切面编程)
AOP (即 Aspect Oriented Programing) 称为:面向切面编程,它是一种编程思想。在程序运行的时候,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 比如业务A和业务B现在需要一个相同的操作,传统方法我们可能需要在A、B中都加入相关操作代码,而应用AOP就可以只写一遍代码,A、B共用这段代码。并且,当A、B需要增加新的操作时,可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。 简单来说就是“纵向重复,横向抽取”这很抽象, Filter 的思想,过滤器在解决乱码的时候不需要我们在每一个类中都写处理乱码的代码。而是直接由 Fliter 来统一处理。还有拦截器的思想,我们在 Action 中需要对参数进行校验、封装,而拦截器又是统一对参数进行校验、封装。 不管是 Fliter 还是拦截器,都是面向切面编程思想的具体应用。
在实际开发中,比如商品查询、促销查询等业务,都需要记录日志、异常处理等操作,AOP把所有共用代码都剥离出来,单独放置到某个类中进行集中管理,在具体运行时,由容器进行动态织入这些公共代码。
Spring AOP 的具体实现 : 动态代理 和 cglib 代理
Spring 中通过代理来体现 AOP 的思想,而代理的实现又分为动态代理和 cglib 代理。动态代理要求代理类和被代理类实现同一个接口。而 cglib 是继承代理,代理对象只需继承被代理对象即可实现。在 Spring 中优先使用动态代理。
Spring 中与 AOP 相关名词
连接点(joinPoint): 在目标对象中,所有可以增强的方法。
切入点(pointCut): 在目标对象中,已经增强的方法。
增强/通知(advice): 增强的代码。
目标对象(target): 被代理对象。
织入(weaving): 将通知应用到到连接点。
代理(Proxy): 将通知织入到目标对象形成代理对象。
切面(aspect): 切入点+通知。
小福利
1. IOC的优点是什么 ?
1) .减少代码的耦合,可以使应用更加模块化
2) .增加代码的复用率
3) .资源更加统一管理
4) .维护代码更加方便,一般只需要修改一下配置文件就ok了。
5) .提升了程序的测试性
2. DI是怎么实现的 ?
1.实例化Bean对象:服务器启动时,初始化spring容器,创建由XML配置或添加了相应注解的类的实例,并将实例保存到Spring容器中;
2.完成ID操作:通过XML描述或对应注解,完成对象之间的依赖关系,此过程称为依赖注入,spring支持3种注入实现:
①注解注入:通过注解显示注入。常用注解@Resource。
②XML注入:通过xml显示注入。
③自动注入:隐式进行bean搜索并自动装配
3.IOC 和 DI 的关系
IoC 控制反转,指将对象的创建权,反转到Spring容器 ,
DI 依赖注入,指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
DI依赖注入不能单独存在,必须在IoC控制反转的基础上才能完成。
4.AOP 的好处
AOP:面向切面,是一种编程思想。
将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。
AOP解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
5.AOP和代理模式
代理模式:分为静态代理、JDK动态代理、cglib代理
1.静态代理
代理类和被代理类实现共同的接口(或继承),代理类中存有指向被代理类的引用,实际执行时通过调用代理类的方法、实际执行的是被代理类的方法。
2.jdk动态代理:必须有接口和实现类(目标类),通过工具类Proxy生产接口对应的代理类,从而对目标类进行增强。
3.Cglib代理:Cglib代理生成的代理类是目标类的子类,所以目标类不能使用final修饰。
AOP
Spring AOP通过代理的方式,对目标类进行增强。
Spring aop底层默认使用JDK动态代理,通过配置可以修改成cglib代理。
这就是小喵整理的一些Spring IOC 和 Spring AOP 的一些知识
希望对大家学习有所帮助!
(^_^)~喵~!!
来源:oschina
链接:https://my.oschina.net/u/4232197/blog/3213201