Spring/Spring-Boot 学习2 入门知识
Posted 龙龙爱阿喵!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring/Spring-Boot 学习2 入门知识相关的知识,希望对你有一定的参考价值。
在Spring/Spring-Boot的入门上我绕了很多弯路,我绕过的一个典型的弯路是:
找一个Spring-Boot的入门案例,下载代码跟着跑了一遍,跑通之后确不能理解代码,尤其是各种配置文件以及注解让我难以理解这个程序究竟是怎么跑起来的。@Autowired, @Controller这些注解到底是什么意思,它的工作流程是怎样的? 我怀疑自己是注解相关的知识没有学好,于是往下挖注解的工作原理-->动态代理机制-->反射-->类加载过程-->类加载器的工作原理。这样一套走下来之后,即使我懵懵懂懂明白了类加载器、反射、动态代理、注解, 我还是不能看懂spring的这些注解是怎么工作的,也不知道怎么去实际使用他们。
很多的入门教程,给出了很多具体的操作,但是并没有告诉我们为什么spring要用这个注解,这个注解用了之后他会有什么作用,以及这些注解的工作流程(我指的是使用流程不是底层的实现原理)。
下面是我自己的一些学习反思。
首先我们从最基本的需求讲起。
java是面向对象的语言,每个对象都可以绑定一定的操作,通过将多个对象组合,我们可以完成一个任务所需要的所有操作。
举个例子,假设我们的任务是接收用户对 localhost:8080/user 这个链接的get请求,返回给用户浏览器一个含有用户数据的json数据串 “{"name":"bob"}”。我们把这个任务分成到多个对象去完成:数据访问对象DAO用来查询数据库,得到用户名称 bob;控制对象controller接收外界请求; model对象用来装配数据; 这些一个个分立的对象如果要一起完成这个任务,我们需要将组合起来完成数据的传递。我们需要在controller对象中包含model对象,因为model对象包含了要返回给前台的数据;在model对象中我们需要包含DAO对象,因为生成model所需要的数据需要去数据库中查。通过对象的组合,实际上是各种操作的组合,我们完成了数据的传递,完成整个任务。
在上面的过程中,我们发现,在某个对象中我们需要包含一些提供本类对象操作的下游对象。如DAO对象就是model对象的下游对象,model对象的操作需要DAO对象提供的数据支持,因此我们需要在model对象包含一个DAO对象,将DAO对象作为model的成员。问题是这个DAO对象是从哪儿来的?
一个直接的思路是在构造model对象的时候,直接在构造函数中提供DAO对象,这样model对象就能得到这个DAO对象的引用。DAO对象怎么来的呢?当然也是构造出来的了(new),那如果DAO对象中也有需要包含的下游对象怎么办呢?如DAO对象必然需要一个成员是数据库连接对象connector, 直接的想法是像 model 对象一样,在构造的时候直接提供connector。但是connector又可能需要其他的成员....这样就形成了一层层的递归调用。在构造顶层对象的时候,由于这一层层的包含关系,我们需要一层层的递归构造下游的所有对象。递归在生产中的坏处不言而喻,就是容易OOM。那怎么解决这个问题呢?一个很自然的想法是,如果我们提前知道有哪些下游对象,我们就在环境启动之前将这些下游对象都提前构造好,然后上层对象要使用的时候就直接拿过来使用就好,不必再去自己递归构造。如果说之前的做法是“懒人式”的(事到临头才去准备需要的对象), 那么现在的做法就是“勤奋式”的,不管你后面要什么,凡是下游的对象我都提前给你准备好。好,既然思路有了,那么我们要怎么做呢?首先,你怎么知道哪些对象是下游的?其次,你把这些下游对象构造,暂时不用,放到哪儿呢?最后,你在上游使用这些对象的时候,怎么去取用呢?
这三个问题引出了spring/spring-boot的解决方案。依赖注入。
第一个问题:你如何知道哪些对象是下游的?
Spring/Spring-Boot的解决方式有两种:xml配置或者注解配置。
假设我们有一个下游类叫Student, 定义如下:
public class Student{
private String name;
//getter and setter...
}
以上是关于Spring/Spring-Boot 学习2 入门知识的主要内容,如果未能解决你的问题,请参考以下文章