一. 环境搭建
a. IDE:IntelliJ IDEA
> 进入官网下载安装,下载地址
破解注册码
b. Java 1.8 以上版本(官方推荐)
> Java安装自行百度,切记配置**环境变量**
二. Spring boot框架学习(公司项目是基于Spring boot基础框架进行开发的)
其中pom.xml文件是整个项目用于包依赖管理配置文件。
<?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.yezhennan</groupId>
<artifactId>JavaLearn</artifactId>
<version>1.0-SNAPSHOT</version>
<name>JavaLearn</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<springfox.version>2.6.1</springfox.version>
<springboot.version>1.5.9.RELEASE</springboot.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>${springboot.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${springboot.version}</version>
</dependency>
<!-- Swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(1) 引入Spring boot 打开pom.xml文件,设置spring-boot-starter-parent为父亲项目,这种方式可以比较容易的使用父项目中的starters的依赖。 当然也可以不用继承spring-boot-starter-parent为父亲。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
</parent>
引入web依赖,Web starter依赖引入,会增加web容器、springweb、springmvc、jackson-databind等相关的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2) 增加Hello world示例程序类SampleController。
@Controller
@EnableAutoConfiguration
public class SampleController {
@RequestMapping("/")
@ResponseBody
String home() {
return "Hello World";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleController.class, args);
}
}
其中,@Controller和@EnableAutoConfiguration为框架提供的注解。并且类提供了main方法以及返回"hello world"字样的方法。紧接着,直接运行SampleController类。访问http://localhost:8080/就可以访问这个controller的功能了。访问效果如下:
至此,就是最简单的hello world程序。
三. 构建小而全的完整web项目
(1) 一睹完整的包目录结构
其实这些也是官方推荐的目录结构,采用包分层结构,让项目结构更清晰。
configuration: 项目自身代码级别的配置文件目录。
controller: 前端代码控制层。
dao: 数据访问层一般也可以写作repository。
entity: 数据实体。
service: 业务逻辑层。
Application: 程序启动入口。
resources项目资源存放目录
其中application.properties为项目开发属性配置文件。
(2) 添加主程序入口类Application
/**
* 项目启动入口,配置包根路径
*/
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
(3) 创建一个用户实体类User
@Entity
@Table(name = "tbl_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private String password;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(4) 创建数据访问类UserRepositoty
@Repository
public interface UserRepositoty extends JpaRepository<User, Long> {
@Query("select t from User t where t.name = :name")
User findByUserName(@Param("name") String name);
}
注意这里继承的类为JpaRepository,需要引入相应的框架。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
添加JpaConfiguration配置类。
@Order(Ordered.HIGHEST_PRECEDENCE)
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
@EnableJpaRepositories(basePackages = ccom.system.business.useress.user)
@EntityScan(basePackages com.system.business.usersiness.user)
public class JpaConfiguration {
@Bean
PersistenceExceptionTranslationPostProcessor persistenceExceptionTranslationPostProcessor() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
UserRepositoty类中通过方法findByUserName获取一个用户实体,利用注解@Query申明了查询数据库的语句。 因此这个时候本机需要安装数据库软件,我的mac安装的是MySql,此处省略MySql的安装以及使用,请自行百度。
现在需要在application.properties文件中为项目配置相应的信息。
#MySQL
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#Spring Data JPA
spring.jpa.database=MYSQL
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
# Naming strategy
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.datasource.url这里申明了所使用的数据库为test,这里有个坑,首先需要确保本地已经创建了test数据库,并且本地数据库服务启动运行。spring.datasource.username、spring.datasource.password申明了访问数据库的账户和密码,这个也需要正确。
打开pom.xml文件,导入Jpa以及MySql。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
(5) 创建业务逻辑层代码UserService。
@Service
public class UserService {
@Autowired
private UserRepositoty userRepositoty;
public User findUserByName(String name) {
User user = null;
try {
user = userRepositoty.findByUserName(name);
} catch (Exception e) {
}
return user;
}
}
方法很简单,入参通过名字获得一个用户信息。 (6) 最后创建提供给前端使用的接口api,创建UserController类。
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/index", method = RequestMethod.GET)
public String index() {
return "user/index";
}
@RequestMapping(value = "/show", method = RequestMethod.GET)
@ResponseBody
public String show(@RequestParam(value = "name") String name) {
User user = userService.findUserByName(name);
if (null != user)
return user.getId() + "/" + user.getName() + "/" + user.getPassword();
else return "null";
}
}
此类提供了两个方法,index方法返回了一个路径。show方法返回拼接后的用户信息。
最后在resources下面添加一个测试页面。内容如下图:
打开application.properties文件,添加配置信息。
#视图层控制
spring.mvc.view.prefix=classpath:/templates/
spring.mvc.view.suffix=.html
spring.mvc.static-path-pattern=/static/**
OK,一切准备就绪,剩下的就是启动Application了。
- 特殊类名规范
Spring配置类: configuration/*Configuration,例如WebConfiguration/DatasourceConfiguration
Properties类: properties/*Properties,例如FtpProperties
dao类:dao/*Dao或者dao/*Repository
service类:service/*Service
- ** 分层命名规范 **
domain: 数据库PO
dao/repository:数据库访问层
service:业务逻辑层
dto:数据传输对象
constants:枚举常量
controller:web控制器
form:web请求对象
vo:web响应对象
validator:校验器
batch:批处理Job类
对于每个项目可以按照如下方式进行划分为4个模块,独立为4个maven模块
- Parent
负责依赖管理,公用的maven依赖
- Service (lib)
包含整个项目的业务逻辑/数据访问代码
- Exportapi (lib 或 app)
项目对外API提供,RPC等。依赖Service,可单独部署也可打进web包进行部署。
- Web (app)
项目web接口暴露代码,包括前后端接口暴露,文档,拦截器。依赖service、exportapi
- Batch (app)
项目批处理任务,常驻进程任务或者定时任务,依赖service
- 接口定义规范
Http Method
GET:读取数据,不允许有数据的修改等操作
列表URL设计:GET:/web/custmer
单条数据URL设计:GET:/web/customer/{custmerId}
POST:新建数据
POST:/web/custmer
PUT:修改数据
PUT:/web/custmer/{custormId}
PUT:/web/custmer/status/{custormId}
DELTE:删除数据
DELETE:/web/custmer/{custormId}
请求体与响应体
请求与响应除QueryString及PathVariable外,其余数据交互应以Json格式进行交互
Controller配置为@RestController, 前后端ContentType:application/json; charset=UTF8
- Swagger应用
所有controller都用swagger annotation进行注解,springfox嵌入以提供接口文档及try out调试功能
- TraceFilter
添加TraceFilter,对于每个请求随机生成RequestID并放入MDC进行日志打印,便于排查
- 异常消息定义及ExceptionHandler
自定义完善的异常处理器,按照和前端定义好的接口产生异常消息体。通过HTTP CODE定义各类状态
200 成功
409 校验失败,例如非空、长度、格式等
400 客户端请求格式错误,例如不是合法的Json
401 未授权即未登录
403 无权限访问
404 不存在,未找到响应对象
500 服务器内部错误
异常消息体定义
{
"errorCode": 1, // 保留错误码字段
"message": "全局异常消息",
"fieldErrors": [
{
"name": "名称不允许重复"
},
{
"desc": "描述太短"
}
]
}
- 数据源及数据库连接池配置
建议使用Alibaba Druid连接池配置
同时建议配置DruidStat,即可通过web管理数据源监测数据,见
@Bean
public ServletRegistrationBean druidServlet(DruidStatProperties druidStatProperties) {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
reg.addInitParameter("loginUsername", druidStatProperties.getUsername());
reg.addInitParameter("loginPassword", druidStatProperties.getPassword());
return reg;
}