新建父项目
youfanmiaosha2
pom文件
共有的依赖spring boot,spring boot有父依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.youfan.miaosha2</groupId> <artifactId>youfanmiaosha2</artifactId> <packaging>pom</packaging> <version>1.0</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> </parent> <properties> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
参考:dependencyManagement与dependencies区别
最近在阅读maven项目代码时,dependencyManagement与dependencies之间的区别不是很了解,现通过项目实例进行总结:项目epps-demob-pom下有一个模块是epps-demob-war。
一、dependencyManagement应用场景
为了项目的正确运行,必须让所有的子模块使用依赖项的统一版本,必须确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。在我们项目顶层的pom文件中,我们会看到dependencyManagement元素。通过它元素来管理jar包的版本,让子项目中引用一个依赖而不用显示的列出版本号。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
epps-demob-pom中dependencyManagement如下:
<modules> <module>epps-demob-war</module> </modules> <properties> <spring-version>3.1.1.RELEASE</spring-version> </properties> <dependencyManagement> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring-version}</version> </dependency> </dependencyManagement>epps-demob-war中dependency如下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> </dependencies>这样做的好处:统一管理项目的版本号,确保应用的各个项目的依赖和版本一致,才能保证测试的和发布的是相同的成果,因此,在顶层pom中定义共同的依赖关系。同时可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改;如果某个子项目需要另外一个版本号时,只需要在dependencies中声明一个版本号即可。子类就会使用子类声明的版本号,不继承于父类版本号。
二、dependencies应用场景
相对于dependencyManagement,如果在epps-demob-pom中通过dependencies引入jar,将默认被所有的子模块继承。
三、dependencyManagement与dependencies区别
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显式的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
dependencies即使在子模块中不写该依赖项,那么子模块仍然会从父项目中继承该依赖项(全部继承)。
新建模块:注册中心
pom引入注册中心的依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>youfanmiaosha2</artifactId> <groupId>com.youfan.miaosha2</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>youfanRegisterCenter</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <build> <finalName>youfanRegisterCenter</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> <resources> <!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 --> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}/classes</targetPath> <includes> <include>**/*</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
resources文件夹下配置文件application.yml
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false # 是否向 Eureka 注册服务。该应用为服务注册中心,不需要自注册,设置为 false fetchRegistry: false # 是否检索服务。该应用为服务注册中心,职责为注册和发现服务,无需检索服务,设置为 false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ spring: application: name: youfanRegisterCenter
新建包com.youfan.controller
包下新建类eureka
package com.youfan.controller; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServer { public static void main(String[] args) { SpringApplication.run(EurekaServer.class,args); } }
用户模块设计
新建模块youfanUser
pom添加依赖
作为客户端,引入eureka
下面用到mybatis,引入
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>youfanmiaosha2</artifactId> <groupId>com.youfan.miaosha2</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>youfanUser</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> </build>
resources文件夹下创建application.properties
server.port=8081 spring.application.name=youfanUser
新建com.youfan包
包下建YouFanUserApplication类
package com.youfan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication public class YouFanUserApplication { public static void main(String[] args) { SpringApplication.run(YouFanUserApplication.class, args); } }
建control包
建测试类UserTest
package com.youfan.control; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; @RestController public class UserTest { @RequestMapping(value="sayHello", method= RequestMethod.GET) public String sayHello(HttpServletRequest req){ String remoteAddr = req.getRemoteAddr(); return "hello " + remoteAddr + "!!"; } }
启动
建service包
新建数据库youfanshop
新建表youfanuser
新建模块youfanCommon
pom配置常用工具
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>youfanmiaosha2</artifactId> <groupId>com.youfan.miaosha2</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>youfanCommon</artifactId> <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> </dependencies> </project>
新建包com.youfan.entity
新建类UserInfo
package com.youfan.entity; public class UserInfo { private int id;//主键 private String account;//用户名 private String encryptionPassword;//加密密码 private String originalPassword;//未加密密码 private int sex;//性别 0男1女 private String telphone;//手机号 private String birthday;//生日 private String qq;//qq private String weixin;//微信号 private String idCard;//身份证号 private String name;//姓名 private int age;//年龄 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getEncryptionPassword() { return encryptionPassword; } public void setEncryptionPassword(String encryptionPassword) { this.encryptionPassword = encryptionPassword; } public String getOriginalPassword() { return originalPassword; } public void setOriginalPassword(String originalPassword) { this.originalPassword = originalPassword; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public String getTelphone() { return telphone; } public void setTelphone(String telphone) { this.telphone = telphone; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } public String getQq() { return qq; } public void setQq(String qq) { this.qq = qq; } public String getWeixin() { return weixin; } public void setWeixin(String weixin) { this.weixin = weixin; } public String getIdCard() { return idCard; } public void setIdCard(String idCard) { this.idCard = idCard; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
整合mybatis
在youfanUser的pom中添加依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>youfanmiaosha2</artifactId> <groupId>com.youfan.miaosha2</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>youfanUser</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mybaits--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies> <build> <finalName>youfanUser</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> <resources> <!-- 先指定 src/main/resources下所有文件及文件夹为资源文件 --> <resource> <directory>src/main/resources</directory> <targetPath>${project.build.directory}/classes</targetPath> <includes> <include>**/*</include> </includes> <filtering>true</filtering> </resource> </resources> </build> </project>
YouFanUserApplication中添加bean和注解
package com.youfan; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.tomcat.jdbc.pool.DataSource; import org.mybatis.spring.SqlSessionFactoryBean; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.context.annotation.Bean; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; @SpringBootApplication @EnableEurekaClient@MappScan("com.youfan.mapper") public class YouFanUserApplication { @Bean @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource(){ return new org.apache.tomcat.jdbc.pool.DataSource(); } @Bean public SqlSessionFactory sqlSessionFactoryBean() throws Exception{ SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource()); PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath:/mappers/*.xml")); return sqlSessionFactoryBean.getObject(); } @Bean public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } public static void main(String[] args) { SpringApplication.run(YouFanUserApplication.class, args); } }
pom添加youfanCommon依赖
<dependency> <groupId>com.youfan.miaosha2</groupId> <version>1.0</version> <artifactId>youfanCommon</artifactId> </dependency>
新建com.youfan.mapper包,下面新建UserMapper接口
package com.youfan.mapper; import com.youfan.entity.UserInfo; public interface UserMapper { public UserInfo findUserByid(int userid); }
新建上面classpath路径和文件,resources下新建User.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.youfan.mapper.UserMapper"> <select id="findUserByid" resultType="com.youfan.entity.UserInfo" parameterType="int"> select account,encryptionPassword,sex,telphone,qq,weixin,age,birthday from youfanuser where id = #{userid} </select> </mapper>
application.properties中配置数据库
server.port=8081 spring.application.name=youfanUser eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/ #mysql配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/youfanshop?useUnicode=true&characterEncoding=gbk&zeroDateTimeBehavior=convertToNull spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver
新建com.youfan.dao包
新建UserDao
package com.youfan.dao; import com.youfan.entity.UserInfo; import com.youfan.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class UserDao { @Autowired private UserMapper userMapper; public UserInfo findUserByid(int userid){ return userMapper.findUserByid(userid); } }
idea报Could not autowired解决办法
本文链接:https://blog.csdn.net/yxm234786/article/details/81460752
service下新建UserService
package com.youfan.service; import com.youfan.dao.UserDao; import com.youfan.entity.UserInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserDao userDao; public UserInfo findUserByid(int userid){ return userDao.findUserByid(userid); } }
control下新建UserControl
package com.youfan.control; import com.alibaba.fastjson.JSONObject; import com.youfan.entity.UserInfo; import com.youfan.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class UserControl { @Autowired private UserService userService; @RequestMapping(value = "findUserbyId", method = RequestMethod.GET) public String findUserbyId(int id){ UserInfo userInfo = userService.findUserByid(id); String result = JSONObject.toJSONString(userInfo); return result; } }
配置maven仓库镜像,settings.xml中添加:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- junit镜像地址 -->
<mirror>
<id>junit</id>
<name>junit Address/</name>
<url>http://jcenter.bintray.com/</url>
<mirrorOf>central</mirrorOf>
</mirror>
数据库插入一条数据
启动
整合thymeleaf
pom依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
resources下新建文件夹templates
新建viewUser.html
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"/> <title>Title</title> </head> <body> <table border="1"> <tr> <td>账号</td> <td>手机号</td> <td>生日</td> <td>qq</td> <td>微信</td> </tr> <tr> <td><span th:text="${userInfo.account}"/></td> <td><span th:text="${userInfo.telphone}"/></td> <td><span th:text="${userInfo.birthday}"/></td> <td><span th:text="${userInfo.qq}"/></td> <td><span th:text="${userInfo.weixin}"/></td> </tr> </table> </body> </html>
修改UserControl
package com.youfan.control; import com.alibaba.fastjson.JSONObject; import com.youfan.entity.UserInfo; import com.youfan.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.Controller; @Controller public class UserControl { @Autowired private UserService userService; @RequestMapping(value = "findUserbyId", method = RequestMethod.GET) public String findUserbyId(int id, Model model){ UserInfo userInfo = userService.findUserByid(id); model.addAttribute("userInfo", userInfo); return "viewUser"; } }
报错org.thymeleaf.exceptions.TemplateInputException: Error resolving template解决方案
链接:https://blog.csdn.net/Lin_xiaofeng/article/details/79122053
原文地址:https://www.cnblogs.com/aidata/p/11622369.html