关于容器的思想——作用、意义
- 前言:以下内容是我为了理解什么是容器而总结的。野性我是个Java开发的,但是直接学的spring boot,因此对于spring不是多了解,只会增删改查啊。所以下面内容我尽可能用通俗易懂的言语来叙述。
- 容器是什么?: 这个容器就是字面意思,装很多东西的容器。需要用的时候拿出来。但是用在平时的Java项目中,就是我们说的什么“依赖注入”、“IOC容器”一类的。其中IOC全称是Inversion of Control,中文就是控制反转的意思。其实依赖注入与控制反转是一个意思。下面我会继续说的。
- 那么容器野性我没法说的很清楚,让人看的很迷糊。那我就可以举个例子,这里如果没有做过一个分层次项目的应该不是很懂。
一个项目:野性我自己对一个项目的理解:从上到下是controller(业务层),service(业务接口层),serviceimpl(业务接口实现层)。分层的原因自然是为了让代码各司其职。controller只需要调用相应的接口,比如增删改查接口。而service层只需要写具体要做什么,也就是抽象方法、抽象函数。最后serviceimpl要做的就是实现service接口层的接口,让每个抽象方法有自己对应的逻辑。比如查询接口的实现类,是需要分页查询呢,还是多表查询等等。
通过以上说明,大家应该对一个项目的层次有点意识了吧。 - 关于new:其实new出一个对象并且调用方法,跟从容器中取出对象是一样的作用,但是new是用:A a = new A( ); 这样的形式创建对象。如果是一个接口(M)有若干实现类,那就是M m = new A( ); 。而容器是用(我理解的容器创建对象的来调用其中方法的原理):
`
public class B{
private M demo01;
public void demo(M demo02){
this.demo01=demo02;
}
}
`
- 这段代码就是类似于new出来的接口对象。看起来,哎呀,好麻烦啊!但是依赖注入的方式有多种,其中一种就是添加注解。在这里我们可以用 @Autowired 这个注解然后注解写在 private M demo02; 上面,这样就相当于new了一个接口,这个注解应该不少人在controller用过吧?那你们有没有困惑,用它具体是什么个原理?反正我是有,那我理解的原理其实就是这段代码的效果。而用了这个注解,就无需在B中new一个A对象,把这个调用接口的权力交给spring容器,这个就是我理解的” 控制反转(IOC) “。
- 那我们用它有啥用呢?怎么都说什么可以解耦呢?野性再举个例子:
在上面我说了controller、service、serviceimpl之间的关系,那我们发现前两个最少操心,层层调用就完事,但是impl层需要修修改改。那接口A比如有增删改查等抽象方法,我们用的MySQL来实现接口的增删改查。那这个时候换成Oracle来实现怎么办呢?那我们impl肯定要新写一个实现类,但是如果在controller中我们调用接口层时,用的是new的方式创建的,那我们是不是得更改new的接口的实现类?那如果一个controller里面用了好几个接口呢?那我们得每个都更改?
我在弄明白这个我弄明白这个之前,就一直在controller用的 @Autowired 注解。一直只知道这样做而已。
那我现在明白了,我用这个注解,让spring容器给我创建对象,那我时不时不用关心这个接口的具体形态了?new后面跟着是哪个实现类我不用关心了? - 对吧,这就是容器的一个作用,野性我是从这个角度来考虑这个容器思想的。