Session 1 初识Spring

2018-06-08  本文已影响0人  5afbde9dd015

一些想法

       虽然说接触spring已经这么长时间了,不管大大小小的项目基本都用到了spring,虽然说到spring大家都会想到什么aop和ioc(di) ,但是只是知道spring主要是由这两个方面组成,但实际用起来,也只是一些注解什么的,也没有深入的去了解他的机制是什么,所以,最近决定要好好捋一捋spring,因为虽然每天都在用,但是还是觉得少了点什么,so,废话不多说,let`s go。

一 ioc和aop

1.1 ioc

竟然学到spring那还是要简单了解一下ioc和aop的,首先说一下ioc(di),即控制反转,或者是依赖注入,假设我们有一个骑士,和一个杀boss的任务

```

/**

* 这是一个只能杀boss的骑士 实现了knight的接口

*/

public class KillTheBossKnightimplements Knight{

private KillTheTimokillTheTimo;

    public KillTheBossKnight(){

this.killTheTimo =new KillTheTimo();

    }

@Override

    public void doTheJob() {

System.out.println("杀死了一个提莫大魔王");

    }

public KillTheTimogetKillTheTimo() {

return killTheTimo;

    }

public void setKillTheTimo(KillTheTimo killTheTimo) {

this.killTheTimo = killTheTimo;

    }

```

可以看到要想让骑士完成杀死提莫的任务,就需要将这个任务通过骑士的构造函数注入,这样这两个类就紧耦合在一起,将这个具体的任务和这个骑士紧紧的耦合在了一起,那如果这个其实要去做其他任务呢?这还需要修改他的构造,这样的代码就很不漂亮,因为耦合度越高,后期维护的成本就越高,所以我们可以通过另外一种方式来给来给骑士下发任务。

接下来有请我们勇敢的骑士上场

```

/**

* 没有将具体的操作交给这个骑士,而只是给了他一个任务

*/

public class BraveKnight {

public Jobjob;

    public BraveKnight(Job job){

this.job = job;

    }

public void doTheJob(){

job.doTheJob();

    }

}

```

从这里可以看出,这个骑士只是在构造里面传入了一个Job ,具体是什么Job他并不知道,所以这就是di的意义所在,这个骑士只知道他有任务,但是具体是什么任务,只有等他具体接收的时候才能知道,所以他就可以成为很多骑士,杀死提莫的骑士,杀死亚索的骑士。。。这就是di所带来最大的收益——松耦合。所以我们继续向下操作

```

Job killYasuo =new KillTheYasuo();

BraveKnight braveKnight =new BraveKnight(killYasuo);

braveKnight.doTheJob();

```

这样,就可以把杀死坑逼亚索的任务交给了这个骑士,这样这个其实就可以为所欲为的做任何他想做的事了,而不是仅仅只杀死一只提莫。

这就是依赖注入的思想。

1.2 aop

说完了ioc 接下里继续说说aop

aop 又称面向切面编程,相对于面向对象编程,这又是一个更牛逼的思想,那么何为aop呢,工作中一般任务是怎么划分的?基本分为两种,一种是按照业务逻辑分,比如,订单系统,购物车系统等等,这是在业务层面划分的,还有一种是从代码层面,视图层啊,业务层啊,数据处理层啊,这些划分就是为了更好去处理一些事情,让工作变得更加有效率,代码结构更加清晰。aop也可以理解成这样的一种思想,一般被定义成一种实现关注点分离的技术。系统是由多个模块组成,每个模块负责自己的一个特殊的功能,但是除了自己的任务以外,往往这些模块还需要处理其他事情,比如权限,日志,事务等的管理,这是每个系统都要面临的问题,而aop的思想就是将这些跟主业务无关但是又必须需要的相同的东西剥离出去统一管理,这样就能让这些模块具有更高的内聚性,更加专注于自身的业务,从而使代码更加简洁。

接下来我们继续以骑士与坑逼提莫的故事继续向下细谈

我们假设每次在骑士执行任务的时候都有一个人来记录他的行为,在每次执行任务之前和之后都会记录,我们就叫他死歌吧。我们来把他创造出来

```

public class DeadSinger {

public void singBeforeJob(){

System.out.println("骑士马上就要干掉那个家伙了!!!");

    }

public void singAfterJob(){

System.out.println("骑士干掉了那个家伙了!!!");

    }

}

```

在每次骑士执行doTheJob的时候都需要调用死歌的这两个方法,接下来我们来继续操作

```

public BraveKnight(Job job,DeadSinger deadSinger){

this.job = job;

    this.deadSinger = deadSinger;

}

public void doTheJob(){

deadSinger.singBeforeJob();

    job.doTheJob();

    deadSinger.singAfterJob();

}

```

我们在骑士都构造中传入了这个死歌,并在他执行Job的前后做出了记录,当骑士在执行任务的时候就会有记录,但是这里总感觉有点不对劲,为嘛这个骑士需要管理这个死歌,骑士只需要专心做他的任务就行了,为何还要关系死歌的活动呢,这就很奇怪了,而且把死歌注入这个骑士的体力,呃,想想有点可怕。所以我们就需要将死歌记录从这个骑士执行任务中剥离出来,让死歌专心记录,让骑士专心做任务,并且骑士不应该能感受到死歌的存在,这就是aop的思想,具体的实现,我们下回再聊。

上一篇下一篇

猜你喜欢

热点阅读