• Spring入门导读——IoC和AOP


    和MyBatis系列不同的是,在正式开始Spring入门时,我们先来了解两个关于Spring核心的概念,IoC(Inverse of Control)控制反转和AOP()面向切面编程。

    1.IoC(Inversion of Control)控制反转

    什么是控制反转呢?可以这么通俗的来解释,我们通常写代码当一个类会关联另一个类是会直接在这个类里new,例如:

     1 package day_30_spring;
     2 
     3 /**
     4  * @author 余林丰
     5  *
     6  * 2016年10月30日
     7  */
     8 public class People {
     9     private Eat eat;
    10     
    11     /**
    12      * 在构造方法中创建Eat的对象实例
    13      */
    14     public People(){
    15         eat = new Eat();
    16     }
    17     
    18 }

    现在我们将对象的控制权“反转”,交由第三方容器进行管理,即交由Spring容器帮我们管理,使得我们不再People代码中与Eat对象紧耦合。在看下面的代码:

     1 package day_30_spring;
     2 
     3 /**
     4  * @author 余林丰
     5  *
     6  * 2016年10月30日
     7  */
     8 public class People {
     9     private Action eat;
    10     
    11     /**
    12      * 在构造方法中创建Eat的对象实例
    13      */
    14     public People(Action eat){
    15         this.eat = eat;
    16     }
    17     
    18 }

    Eat类是继承至Action接口的,这实际上就是通过依赖注入(DI,Dependency Inversion)的方式来实现控制反转。通过构造方法来注入。不依赖于具体的Action接口实现,我们只需要传递一个Action接口类进去即可。相比于之前的“传统”代码紧紧的依赖Action的具体实现Eat类,这个代码实际上解了代码的耦合性。Spring有两种构造方式,一种就是我们上面说到的构造器注入,另一种就是set方法注入。所以,IoC的很简单,目的是解耦,手段是通过依赖注入。Spring容器帮我们解决了一切。

    2.AOP(Aspect Oriented Programming)面向切面编程

    那什么又是面向切面编程呢?如果你有了解过代理模式,那么就对AOP比较容易理解了,AOP的原理实际上也是通过动态代理的方式实现的。我们来看下面这个例子:对数据库的操作前会有日志记录,对数据库的操作完后也会有日志记录,“通常”我们可能会这么写。

     1 package day_30_spring;
     2 
     3 /**
     4  * @author 余林丰
     5  *
     6  * 2016年10月30日
     7  */
     8 public class People {
     9     private Logger logger = new Logger();
    10     
    11     public void insert(int i){
    12         logger.beforeInsert();    //插入前的日志记录
    13         //此处插入一条数据
    14         logger.afterInsert();    //插入后的日志记录
    15     }
    16 }

    “单一职责”告诉我们,这样写到底好不好呢?日志记录是People该做的事吗?难道它不应该只负责插入数据的操作吗?正确的做法应该是这么的在People类中只有这几句代码:

     1 package day_30_spring;
     2 
     3 /**
     4  * @author 余林丰
     5  *
     6  * 2016年10月30日
     7  */
     8 public class People {
     9     
    10     public void insert(int i){
    11         //此处插入一条数据
    12     }
    13 }

    那我们怎么在insert方法中先记录日志呢?我们可以用动态代理来实现,即创建一个代理类的对象实例,Spring也已经为我们做好了这件事,仅仅需要配置一下几句话,即可实现。

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans>
     3     <!-- 省略其他配置,只配置aop -->
     4     <aop:config>
     5         <aop:aspect ref="logger">
     6             <aop:pointcut id="insert" expression="execution(* *.insert(..))"/>
     7             <aop:befor point-ref="insert" method="beforeInsert"/>
     8             <aop:after point-ref="insert" method="afterInsert"/>
     9         </aop:aspect>
    10     </aop:config>
    11 </beans>

    事实上我们能实现最开始我们“糟糕”代码的功能了,而且更优美。在这里我们仅仅对IoC和AOP做一个简单的了解,在后面会和MyBatis一样,先学会从第一步配置,再学会怎么用,最后再来了解框架源代码原理等等。

  • 相关阅读:
    网页速度分析:PageSpeed Insights (by Google)
    Win10下Jenkins服务是系统账户导致无法使用用户的私有环境变量
    部署Pod非Running状态,describe查看显示node资源不足
    kubernetes部署Pod一直处于CrashLookBackOff状态
    kubernetes部署的Pod长时处于ContainerCreating状态
    VMWARE用OVF文件方式导入报错:Error importing OVF: Failed to open disk: /var/lib/docker/vmwareOVF/Centos_7_64-bit-disk2.vmdk. Reason: The file specified is not a virtual disk
    VMWARE用OVF文件方式导入报错:Error importing OVF:SHA digest of file CentOS_7_64-bit-file1iso does not match manifest
    Linux系统ssh到其它服务器时间延迟长
    Linux系统服务器重启后进入到急救模式
    linux系统内存使用率飙高到90%
  • 原文地址:https://www.cnblogs.com/yulinfeng/p/6014149.html
Copyright © 2020-2023  润新知