一.选型
浏览了一圈项目,最终选择https://gitee.com/macrozheng/mall,进行学习开发编辑器 intellij IEDA
1. 安装
git clone https://gitee.com/macrozheng/mall
克隆下来后,打开编辑器,直接open这个目录,然后等待,编辑器会自动搞定依赖下载。趁这个时间,先去mysql建个表,导入document/sql 下面的数据库,修改下src/main/resources/application-dev.yml,将连接修改成我们真实的
2. 运行
测试的mall-admin模块
一段时间后,点击下面rundashboard,选择MallAdminApplication,右键直接run
ok,项目启动,测试下:http://localhost:8080/swagger-ui.html#/
完美。心情舒畅。
3.搭建访问后台
https://github.com/macrozheng/mall-admin-web.gitcd mall-admin-webnpm installnpm run dev
install一定要等他执行完,中断的话,请手动删除node_modules目录,否则会让你痛不欲生
完美
二.代码分析
首先看pom
根目录下的定义了几个模块,进入mall-admin,查看pom.xml.干了以下几件事
定义项目名称版本等设置spring-boot项目设置编码设置依赖,spring-boot,myBatis(数据库),swagger(文档),jwt(认证),oss(文件存储),logstash(日志),druid(连接池),lombok(精简注释)由于我的java版本过高,导致了有些库不在了,手动添加了下面依赖,否则登录会报错,解析不了查询结果
javax.xml.bindjaxb-api2.3.0com.sun.xml.bindjaxb-impl2.3.0com.sun.xml.bindjaxb-core2.3.0javax.activationactivation1.1.1
查看入口
入口文件 mall-admin/src/main/java/com.marcro.mall/MallAdminApplication
特别新的手会问为啥知道这个是入口,没看spring boot的基础学习的时候,我也想过。类上面有@SpringBootApplication注解的是启动类,还有个需要注意,spring boot遵循约定大于配置,所以不是所以东西都有配置,如果要找的话,要一层层往源码上找。所以看spring boot的项目需要做到不要去想这里为什么要这样写,约定就是这样。
@SpringBootApplication 指定这个类是个spring boot启动类,需要完成SpringApplication.run@MapperScan 是myBatis的注解,设置扫描目录,避免单个文件去加@Mapper@EnableTransactionManagement 开启数据库事务,然后在使用访问数据的service方法上加@Transactional即可一个spring boot即配置完成,是不是感觉比想象中的简单很多!当然学习这个代码的前提是你要对spring boot的目录结构,注解和maven的pom文件需要有基本的了解。
控制器
进入controller目录,找个控制器看看是什么样子,就拿刚才运行的swagger文档的第一个吧CmsPrefrenceAreaController,上面的import先不管
@Controller 声明这个是个控制器,一般php都是通过路由转发直接指定,控制器一般都继承了父类,这个声明就相当于注册到路由说我这里是个控制器,然后继承了一堆spring contrller的一堆注解下来@Api,这个是用于swagger自动生成api文档的注释@RequestMapping 是设置路由目录@Autowired 自动装配变量,有这个注释的会自动增加get和set方法,并且根据类型,自动注入相应的实例,比如这里的 prefrenceAreaService 就自动注入为CmsPrefrenceAreaService,下面方法里面prefrenceAreaService 即可以直接用相应的方法,这个php开发的比较难理解,类属性不经过初始化,自动就设置了。需要理解他的ioc和di容器方法上的@ApiOperation是swagger生成文档的api的名称方法上的@RequestMapping是具体路径,和类的连起来访问 /prefrenceArea/listAll方法上的@ResponseBody是 spring 控制器返回的注释,将方法的返回值以特定的格式返回到response的body区域,给访问者返回方法体里面就调用之前@Autowired 注入进来的service里的listAll方法查询数据,然后返回至此一个控制器完成,写起来是不是也很简单
service
既然上面控制器用到了service读取数据,那就再接着看看CmsPrefrenceArea到底完成了什么工作要看懂这个service如何运行的,需要先记住下面这张图
理解了这个图,就很好理解他怎么读数据了,CmsPrefrenceAreaService -> listAll,这个只是个接口,而实现是下面的impl
打开CmsPrefrenceAreaServiceImpl,找到listAll方法,注意上面的注解 @Service,并且这个类是实现的那个接口,也就是说通过注解,spring boot会自动把这个实现类注入到@Autowired 声明的CmsPrefrenceAreaService变量里面。
需要仔细理解这个流程。 那么控制器里面的prefrenceAreaService.listAll()实际就是调用的这个实现类的方法。 是不是很绕? 知道原理后直接暴力认为就是实现类里面的方法就行了。
这个实现类干了些啥?当然是实现接口的listAll方法。 同上面一样 @Autowired 注入了CmsPrefrenceAreaMapper,这个mapper同样只是接口,他对应的是CmsPrefrenceAreaMapper.xml,在mall-mbg,src/main/resources/com/macro/mall/mapper/CmsPrefrenceAreaMapper.xml文件,接口的方法对应相应的id。那么就是说, listAll =>apper.selectByExample =>xml 里面的
或许你会疑惑,他怎么知道去找哪个文件,回头看看MallAdminApplication这个文件,上面记得有个@MapperScan注解么?里面就扫描了目录,自动去生成了映射文件。
至于怎么生成,怎么关联,怎么自动找到service,serviceImpl,mapper,xml,最终sql的执行和一些mock数据的返回等等,有兴趣的可以去看源码,而这也是高手升级的必经途径,以后等我读完源码也会更新一些文章。
至此,一个完整的service流程解读完毕,虽然里面还有很多黑盒子等待我们去打开。但是至少我们知道他是怎么回事了。
再补张myBatis的运行流程图,加深记忆
这里有个多模块开发和一些model生成的问题需要注意下模型类CmsPrefrenceArea,定义了一些字段,但是仔细看看哦,这个文件是在mall-mbg下,为啥呢,因为mall-admin的pom文件依赖里面声明了需要依赖这个模块。
那就来看看mall-mbg。同样按照套路,pom.xml读起,可看到里面依赖了mybatis的一些库,其中有个org.mybatis.generator。搜索以下,原来这个就是用来自动生成这些model,dao和mapper文件
至此项目大致流程和文件解读完毕。接下来需要学习他的一些组件应用,比如jwt,mybatis,swagger等,后面一个个学习和写文章。
路漫漫其修远兮,吾将上下而求索,诸君共勉