工作总结
工作总结
TODO
spring拦截器 过滤器
线程+线程池
文件系统
消息队列mq
activi 流程
maven
- 加入本地jar包
mvn install:install-file -DgroupId=cn.com.citycloud -DartifactId=authorization -Dversion=1.0 -Dpackaging=jar -Dfile=authorization.jar完整路径
mvn install:install-file -DgroupId=com.citycloud.qcloud -DartifactId=qcloud-oauth2-client -Dversion=2.2.0 -Dpackaging=jar -Dfile=qcloud-oauth2-resource-2.2.0.RELEASE.jar
- 本地的包放在本地文件夹,加入pom文件
<scope>systemscope>
<systemPath>${project.basedir}/lib/xxx.jarsystemPath>
## 这种方式引入的jar包在打包时不会被包含在war包中
- pom
<groupId>xxxgroupId> 通常使用全限定的包名区分该项目和其他项目。
<artifactId>xxxartifactId> 通常和项目名称保持统一
<packaging> jar packaging>
<repositories> 发现依赖和扩展的远程仓库列表
<repository>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
repository>
repositories>
<dependencies>
<scope>testscope>
从依赖构件列表里,列出被排除的依赖构件集,此元素主要用于解决版本冲突问题
<exclusions>
<exclusion>
<artifactId>spring-coreartifactId>
<groupId>org.springframeworkgroupId>
exclusion>
exclusions>
<dependencies/>
settings.xml
- MIrrors
- 使用镜像的一些原因:互联网上有一个同步镜像,地理位置更近,速度更快
- 您希望将特定存储库替换为您可以更好地控制的内部存储库
<mirrors>
<mirror>
<id>planetmirror.comid>
<name>PlanetMirror Australianame>
<url>http://downloads.planetmirror.com/pub/maven2url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
- Profiles
settings.xml中的profile元素是pom.xml profile元素的精简版本。
它由activation,repositories,pluginRepositories和properties元素组成.
如果profile在settings.xml中被激活,则其值将覆盖POM或profiles.xml文件中任何等效的ID配置。
<profile>
<id>downloadSourcesid>
<properties>
<downloadSources>truedownloadSources>
<downloadJavadocs>truedownloadJavadocs>
properties>
profile>
-
Repositories
Repositories是Maven用于填充构建系统的本地存储库的项目的远程集合。它来自这个本地存储库,Maven称之为插件和依赖项。不同的远程存储库可能包含不同的项目,并且在启用的profile下,可以搜索它们以查找匹配的版本或快照工件。 -
Plugin Repositories
pluginRepositories元素块的结构类似于repositories元素。 pluginRepository元素指定Maven可以在哪里找到新插件的远程位置。
<profile>
<id>nexus_150id>
<repositories>
<repository>
<id>maven-releasesid>
<name>local private nexusname>
<url>http://115.231.97.150/nexus/repository/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
<repository>
<id>maven-snapshotsid>
<name>local private nexusname>
<url>http://115.231.97.150/nexus/repository/maven-snapshots/url>
<releases>
<enabled>falseenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>maven-releasesid>
<name>local private nexusname>
<url>http://115.231.97.150/nexus/repository/releases/url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
pluginRepository>
<pluginRepository>
<id>maven-snapshotsid>
<name>local private nexusname>
<url>http://115.231.97.150/nexus/repository/maven-snapshots/url>
<releases>
<enabled>falseenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
pluginRepository>
pluginRepositories>
profile>
- 启用Profiles
<activeProfiles>
<activeProfile>nexus_150activeProfile>
activeProfiles>
日志写法
使用alibab Java Coding Guidelinec插件规范代码
- 什么时候写?
--- 方法入口处(info)
---方法退出前(debug,info)
----流程分支(info,warn)
----异常分支(error) - 写的内容
---入参(必选)
---方法调用(可选) debug
---返回值(可选)
---中间变量(可选) - 写的时候在日志中加入可以查询的条件,以便分辨搜索,如
log.warn("[系统名 模块名] xxxxxx");
工具类
- 所有的变量和方法都是static
- 如果需要用到其他的service,通过spring容器去取
//需要强转类型
(xxxService)SpringContextUtils.getBean("xxxService");
业务写法
1. controller
接受多个对象时,必须把多个对象封装成一个VO类来接受
2. swagger注解:
| 作用范围 | API | 使用位置 |
|---|---|---|
| 对象属性 | @ApiModelProperty | 用在出入参数对象的字段上 |
| 协议集描述 | @Api | 用于controller类上 |
| 协议描述 | @ApiOperation | 用在controller的方法上 |
| Response集 | @ApiResponses | 用在controller的方法上 |
| Response | @ApiResponse | 用在 @ApiResponses里边 |
| 非对象参数集 | @ApiImplicitParams | 用在controller的方法上 |
| 非对象参数描述 | @ApiImplicitParam | 用在@ApiImplicitParams的方法里边 |
| 描述返回对象的意义 | @ApiModel | 用在返回对象类上 |
@ApiImplicitParam
| 属性 | 取值 | 作用 |
|---|---|---|
| paramType | 查询参数类型 | |
| path | 以地址的形式提交数据 | |
| query | 直接跟参数完成自动映射赋值 | |
| body | 以流的形式提交 仅支持POST | |
| header | 参数在request headers 里边提交 | |
| form | 以form表单的形式提交 仅支持POST | |
| dataType | 参数的数据类型 | 只作为标志说明,并没有实际验证 |
| Long | ||
| String | ||
| name | 接收参数名 | |
| value | 接收参数的意义描述 | |
| required | 参数是否必填 | |
| true | 必填 | |
| false | 非必填 | |
| defaultValue | 默认值 |
@ApiImplicitParams({ @ApiImplicitParam(paramType = "body", dataType = "MessageParam",
name = "param", value = "信息参数", required = true) })
在controller类上
@Api(value="用户controller",tags={"用户操作接口"})
在controller方法上
@ApiOperation(value="获取用户信息",tags={"获取用户信息copy"})
在实体类上
@ApiModel(value="user对象",description="用户对象user")
在实体方法上
@ApiModelProperty(value="用户名",name="username")
swagger依赖:
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger2artifactId>
<version>${springfox-swagger2.version}version>
dependency>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-swagger-uiartifactId>
<version>${springfox-swagger-ui.version}version>
dependency>
-
Do类继承Model,不写其他通用的属性,注释属性中文注释lombak,主键注解@Id
-
Dto类继承BaseDto,可以写入其他的Do类作为属性(有其他属性,需注解lombak)
-
Vo类,在controller里作为参数使用注解@ApiModel,@ApiModelProperty,注解lombak
-
mapper接口,方法参数使用Do类,参数名为record,注解@Mapper
-
Service 接受参数为Dto,传给mapper的参数为Dto.getRecord(),返回类型为SWrapper
-
controller extends BaseController方法接受参数Vo,传给service的为Dto,需要把Vo转成Dto通过toDto(Vo,OperateType)方法 返回类型RWrapper
打包
1. jar包:
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
<finalName>springbootdemofinalName>
build>
spring-boot 默认提供内嵌的tomcat,所以打包直接生成jar 包,用java -jar 命令就可以启动。
//nohup 意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行
//当用 nohup 命令执行作业时,缺省情况下该作业的所有输出被重定向到nohup.out的文件中
nohup java -jar test.jar >temp.txt &
Spring程序会按优先级从下面这些路径来加载application.properties配置文件
- 当前目录下的/config目录
- 当前目录
- classpath里的/config目录
- classpath 跟目录
nohup java -jar -Dspring.config.location=D:\config\config.properties xxx.jar> /xx/nohup.out 2>&1 &
2. war包:
有时候我们更希望一个tomcat 来管理多个项目,这种情况下就需要项目是war 格式的。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
<scope>providedscope>
dependency>
spring-boot-starter-tomcat 是原来被传递过来的依赖,默认会打到包里,所以我们再次引入此依赖,并指定依赖范围为provided,这样tomcat 相关的jar就不会打包到war 里了
添加ServletInitializer将项目打成war包,部署到外部的tomcat中,这个时候,不能直接访问spring boot 项目中配置文件配置的端口。
application.yml中配置的server.port配置的是spring boot内置的tomcat的端口号, 打成war包部署在独立的tomcat上之后, 你配置的server.port是不起作用的。
3. assembly插件
为什么需要Assembly插件呢?因为对于服务类型的后台程序,线上运行时一般通过脚本的方式启动和停止,而项目中的目录结构复杂且不够直观,且项目文件也需要合并和过滤,Assembly插件就可以帮助我们完成。
比如现在我们的项目目录如下:
+ src
+ main
+ java
+ resources
+ jdbc.properties
+ bin
+ start.sh
+ stop.sh
+ assembly
+ assembly.xml
最终想要的目录:
+ bin
start.sh
stop.sh
+ conf
jdbc.properties
+ lib(依赖jar包目录)
xxx.jar
分页
- 依赖
<dependency>
<groupId>org.springframework.datagroupId>
<artifactId>spring-data-commonsartifactId>
<version>2.1.8.RELEASEversion>
dependency>
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>1.2.12version>
dependency>
2.分页封装工具类
public class PageInfoAdapter<T> extends PageImpl<T> {
public PageInfoAdapter(Page page) {
super(page.getResult(), PageRequest.of(page.getPageNum() - 1, page.getPageSize()), page.getTotal());
}
}
- controller
public RWrapper listTaskPlan(Pageable pageable,TaskPlan taskPlan)
{
return new RWrapper(taskPlanService.listTaskPlan(pageable,taskPlan));
}
- servicepublic
Page
mybatis
- mybatis逆向工程
generatorConfig.xml文件需要加上不生成注释
自定义的生成文件依赖
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.5version>
<configuration>
<configurationFile>src/main/resources/mybatis/generatorConfig.xml
configurationFile>
<verbose>trueverbose>
<overwrite>trueoverwrite>
configuration>
plugin>
<dependency>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-coreartifactId>
<version>1.3.5version>
<scope>providedscope>
dependency>
response/request
- 给前端返回json格式数据
String json = JsonUtil.bean2Json(object);
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write(json);
- 取得request请求地址
referUri = request.getScheme() + "://" + request.getServerName()
+ ":" + request.getServerPort() + request.getServletPath();
if (request.getQueryString() != null)
{
referUri += "?" + request.getQueryString();
}