重识maven
在之前直接使用了maven,了解了maven的最基本的使用,但是一直没有对maven做一个全面的了解,只知道maven是用来导jar包的,今天对maven做一个重新认识,方便后面理解springboot:
1.maven的父子工程:创建一个maven父工程
创建成功后删除src文件夹,因为父工程只负责管理jar包
1.1.父工程并没有实质性的内容,所有的jar包都在里面,也就是说只需要管理jar包即可,不参与任何逻辑开法
然后再父工程的pom文件中导入依赖:
<dependencies> <!--mysql包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <!--spring包--> <!--mybatis包--> <!--shiro包--> </dependencies>
在以往的项目中我们都是这么导入依赖的,现在导入依赖后,在父工程下创建子模块
创建好子工程后,在回过头查看父工程的pom文件:
可以看到,刚创建的子模块都在父工程的pom文件中显示出来了,在子工程的pom文件中也有这样一段代码
标识该模块的父工程,那么父工程是用来管理依赖的,因此父工程内有的依赖,子工程就会继承该依赖,因此就会在每一个子工程中都导入一遍父工程的依赖,
2.在父工程中拥有很多子模块,每一个子模块都代表了不用的包(package:entity,mapper,service,impl,controller)
而且父工程中的所有jar包,都会被子工程所继承
问题1:
如果依赖非常多的话,就会影响项目的性能,因为每个模块负责的功能都不相同,如果web模块需要shiro的jar包,而其他的模块都不需要该jar包,但是因为父子工程的规则,强制子模块将jar包都导入进来,每一个子模块都都导入进来,就会影响项目于的性能运行速度等。怎么解决?
<!--dependencyManagement标签,被该标签控制的jar包不会被子工程所继承,如果子工程有需要,可以重写父工程中的jar包 并且不需要写版本号(如果写了版本号,就表示是从maven重新下载,而不是继承父类工程的)--> <dependencyManagement></dependencyManagement>
具体实例如下:
<dependencyManagement> <dependencies> <!--mysql包--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.45</version> </dependency> <!--spring包--> <!--mybatis包--> <!--shiro包--> </dependencies> </dependencyManagement>
现在在父工程中,将jar包放入了dependencyManagement标签中,那么子模块就不能从父类中继承了,如果子工程需要用
不用写版本号,继承自父类。
使用maven的好处:
方便了整个项目的管理,解决了jar包冗余的问题,方便分布式开发
问题2:
如果开始分模块开发,那么之前我们项目中写的entity、controler、mapper、service等包都会被分成一个一个的模块,这时候,controller要调用service,service要调用mapper,可是不在一个模块中,如图:
仙子啊mapper中的UserMapper类内存在方法需要调用User实体:
User实体是在另一个model中的,调不到怎么解决?
使用工程依赖
在mapper项目中的pom.xml文件中以jar包的形式引入model项目即可
一旦使用量的工程依赖,就会出现层级依赖
在mapper模块的pom文件中引入model:
<dependency> <!--groupId与父工程的一样--> <groupId>com.zs</groupId> <!--需要引入的模块--> <artifactId>model</artifactId> <!--需要引入的版本号--> <version>1.0-SNAPSHOT</version> </dependency>
然后就可以在mapper中引入User对象了:
问题3:
使用了层级依赖,上级所引用的jar包,下级是否可以引用?
可以引用,在mapper中引用了model,在service中可以直接引用不需要重新导入依赖:
在service模块中引入mapper依赖:
这里并没有引入model的依赖;然后写接口:
注意,在这里仍然可以使用model的依赖,因为service引入了mapper,而mapper引入了model,因此service也可以使用model中的类。
定义实体类的标准:
1.需要实现序列化接口
2.需要重写hashCode和equalse
3.需要重写toString()
4.必须有getter和setter方法
5.要求所有的类型全部为包装类型,不能使用基本类型(因为使用包装类型可以防止空指针异常)