
1、三层架构
三层架构架构指的就是Controller层(用来接收请求,响应数据)、Service层(用来逻辑处理)、Dao层(用来数据访问),那么浏览器发送请求时,会先经过Controller层来接收请求,通过Service层调用Dao层进行数据访问,将文件中的信息进行解析后,返回给Service层来进行逻辑的处理,然后返回给Controller层来对浏览器进行响应。

那么这么做的好处是什么?
解耦指的就是将高关联性的代码进行优化,让每个模块来进行专一的工作,只负责相应的内容,这样有利于我们对数据的维护、拓展,就像对逻辑代码进行维护时,我们只需要将处理逻辑的Service层进行代码优化,而其他模块还是各司其职,减轻了我们的工作量

那么当浏览器访问路径请求数据时,请求传入Controller层,就会去调用Service层,获取数据

那么到达Service层时,获取需要处理的数据,就调用了Dao层,由Dao层访问查询数据

然后Dao层将查询的数据再返回给Service层,交由Service层调用方法来将数据进行逻辑处理

最后呢,Service层将处理好的数据,返回给Controller,最后Controller将获取到的结果响应给前端,那么这样就完成了三层架构的拆分

拆分前后对比,之前将代码全部写到了一起,代码逻辑混乱,复用性差、难以维护。拆分之后,代码逻辑强,代码各司其职,只处理需要的请求,利于我们后面迭代的维护,拓展。

2、分层解耦
内聚:软件中的各个功能模块内部的功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联程度
软件开发原则是低耦合高内聚

当我们在controller层调用了sevice层的对象时,那么我们就将controller层与service层耦合在了一起,这样如果service层的代码出现问题之后,我们不仅需要改动service层的代码,还要对controller层的代码进行维护,这样我们的效率只会大大降低

那么当我们解除这种耦合时,只需要将service层的代码进行维护,其他层都不用去管理维护,通过代码逻辑来将这种功能结合起来,降低两个模块层之间的依赖和关联,这也就是我们所说的解耦操作,为了实现代码的高内聚低耦合甚至是完全的解耦操作
那么我们如何使用逻辑将模块与模块之间实现功能结合呢?
比如我们的controller层必须要调用service层的对象,为了低耦合,我们该如何实现?

那我们可以使用一种方法,我们每次将service层创建的对象放置在一个容器当中,然后由容器将这个对象交给controller层, 那么这将对象放入容器的这个操作就叫做控制反转(IOC),将对象交由其他模块的这个操作叫做依赖注入(DI),这个容器我们就称为IOC容器,或者Spring容器,
3、IOC&DI入门
IOC:Inversion Of Control (Spring的第一大核心)控制反转
DI:Dependency Injection 依赖注入
Bean对象:指的是IOC容器中所创建、管理的对象。
如果需要将类交给IOC容器来管理,我们只需要在类(模块层)前加上注解@Component就可以了,那么需要放入IOC容器的bean对象,需要在模块层所创建的对象前加上注解@Autowired
@Component:代表将此类交由IOC容器管理(控制反转过程)
@Autowired:代表运行时,IOC容器会提供该类型的bean对象,并为其赋值(依赖注入过程)
那么具体的操作步骤如下:



这样下来就完成了层与层之间的解耦操作
4、IOC详解
Spring框架为了更好表示web开发中bean对象的归处,又衍生出了三个注解

一般推荐使用下面三种注解,当还有类不属于这三类时,就使用@Component注解
一般controller的注解不用加入,因为对springboot框架进行web开发时,使用的@RestController已经包含了controller的注解

PS : springboot集成的web开发中,声明控制器bean只能用@Controller,需要注意
那么对于这些注释声明过的模块层,还要注意要用@ComponentScan来扫描包下的注释,如果要扫描的包都在springbootapplication启动项的包内,默认会扫描启动类所在包,以及子包,所以不需要再注释

总结一下:
5、DI详解
当我们开发的项目中,要切换或者维护新的实现类,也就是说我们对多个实现类存在了多个bean对象时,那我们对于旧的实现类和新的实现类就要注释一下,当需要新的的时候,直接将注释加在新的实现类中,如果需要使用旧的实现类同理即可
那么有以下三个注解需要我们了解
@Primary 加在需要实现的模块层上就可以(当然还是需要@Autowired依赖注入)
@Qualifier 需要在@Autowired的下面注释一下所需要的bean对象,默认的bean对象名是类名首字母小写,例如 @Qualifier(“empServiceA”),就代表实现EmpServiceA的bean对象
@Resource 是JDK提供的注解,所以不再需要@Autowired注解,直接将所需要的bean对象value赋值比如 @Resource(name = "empServiceB"),就直接将指定的实现类EmpServiceB的bean对象从IOC容器中获取了出来

总结一下:

1376

被折叠的 条评论
为什么被折叠?



