java实例项目学习

学了一段时间java和springl ,基本的都可以写了,是时候找个项目学习下,了解下做个web项目的整体架构和流程

一.选型

浏览了一圈项目,最终选择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模块
一段时间后,点击下面run dashboard, 选择MallAdminApplication,右键直接run
1.jpg

ok,项目启动,测试下:http://localhost:8080/swagger-ui.html#/

2.jpg

完美。心情舒畅。

3.搭建访问后台

https://github.com/macrozheng/mall-admin-web.git
cd mall-admin-web
npm install
npm run dev

install一定要等他执行完,中断的话,请手动删除node_modules目录,否则会让你痛不欲生
3.jpg
完美

二.代码分析

首先看pom

根目录下的定义了几个模块,进入mall-admin,查看pom.xml.干了以下几件事

  1. 定义项目名称版本等
  2. 设置spring-boot项目
  3. 设置编码
  4. 设置依赖,spring-boot,myBatis(数据库),swagger(文档),jwt(认证),oss(文件存储),logstash(日志),druid(连接池),lombok(精简注释)
    由于我的java版本过高,导致了有些库不在了,手动添加了下面依赖,否则登录会报错,解析不了查询结果
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-core</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

查看入口

入口文件 mall-admin/src/main/java/com.marcro.mall/MallAdminApplication

特别新的手会问为啥知道这个是入口,没看spring boot的基础学习的时候,我也想过。类上面有@SpringBootApplication注解的是启动类,还有个需要注意,spring boot遵循约定大于配置,所以不是所以东西都有配置,如果要找的话,要一层层往源码上找。所以看spring boot的项目需要做到不要去想这里为什么要这样写,约定就是这样。

  1. @SpringBootApplication 指定这个类是个spring boot启动类,需要完成SpringApplication.run
  2. @MapperScan 是myBatis的注解,设置扫描目录,避免单个文件去加@Mapper
  3. @EnableTransactionManagement 开启数据库事务,然后在使用访问数据的service方法上加@Transactional即可

一个spring boot即配置完成,是不是感觉比想象中的简单很多!当然学习这个代码的前提是你要对spring boot的目录结构,注解和maven的pom文件需要有基本的了解。

控制器

进入controller目录,找个控制器看看是什么样子,就拿刚才运行的swagger文档的第一个吧
CmsPrefrenceAreaController,上面的import先不管

  1. @Controller 声明这个是个控制器,一般php都是通过路由转发直接指定,控制器一般都继承了父类,这个声明就相当于注册到路由说我这里是个控制器,然后继承了一堆spring contrller的一堆注解下来
  2. @Api,这个是用于swagger自动生成api文档的注释
  3. @RequestMapping 是设置路由目录
  4. @Autowired 自动装配变量,有这个注释的会自动增加get和set方法,并且根据类型,自动注入相应的实例,比如这里的 prefrenceAreaService 就自动注入为CmsPrefrenceAreaService,下面方法里面prefrenceAreaService 即可以直接用相应的方法,这个php开发的比较难理解,类属性不经过初始化,自动就设置了。需要理解他的ioc和di容器
  5. 方法上的@ApiOperation是swagger生成文档的api的名称
  6. 方法上的@RequestMapping是具体路径,和类的连起来访问 /prefrenceArea/listAll
  7. 方法上的@ResponseBody是 spring 控制器返回的注释,将方法的返回值以特定的格式返回到response的body区域,给访问者返回
  8. 方法体里面就调用之前@Autowired 注入进来的service里的listAll方法查询数据,然后返回

至此一个控制器完成,写起来是不是也很简单

service

既然上面控制器用到了service读取数据,那就再接着看看CmsPrefrenceArea到底完成了什么工作
要看懂这个service如何运行的,需要先记住下面这张图

QQ截图20190322163745.jpg

理解了这个图,就很好理解他怎么读数据了,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 里面的<select id="selectByExample" , 最终执行的是这个sql。

或许你会疑惑,他怎么知道去找哪个文件,回头看看MallAdminApplication这个文件,上面记得有个@MapperScan注解么?里面就扫描了目录,自动去生成了映射文件。

至于怎么生成,怎么关联,怎么自动找到service,serviceImpl,mapper,xml,最终sql的执行和一些mock数据的返回等等,有兴趣的可以去看源码,而这也是高手升级的必经途径,以后等我读完源码也会更新一些文章。

至此,一个完整的service流程解读完毕,虽然里面还有很多黑盒子等待我们去打开。但是至少我们知道他是怎么回事了。
再补张myBatis的运行流程图,加深记忆
4.jpg

这里有个多模块开发和一些model生成的问题需要注意下
模型类CmsPrefrenceArea,定义了一些字段,但是仔细看看哦,这个文件是在mall-mbg下,为啥呢,因为mall-admin的pom文件依赖里面声明了需要依赖这个模块。

那就来看看mall-mbg。
同样按照套路,pom.xml读起,可看到里面依赖了mybatis的一些库,其中有个org.mybatis.generator。搜索以下,原来这个就是用来自动生成这些model,dao和mapper文件

至此项目大致流程和文件解读完毕。接下来需要学习他的一些组件应用,比如jwt,mybatis,swagger等,后面一个个学习和写文章。

路漫漫其修远兮,吾将上下而求索,诸君共勉

标签: springboot

发表评论: