我的SpringBoot实践笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的SpringBoot实践笔记相关的知识,希望对你有一定的参考价值。
Spring Boot四大核心:
自动配置:针对Spring常见的应用程序,能自动提供相关的配置
起步依赖:功能--->引入需要的库 组装机和品牌机的区别
命令行界面:代码--->应用程序
Actuator:???
Spring Initializr使用:
1.http://start.spring.io/
2.Idea Spring Initailzr
3.命令行生成
。。。
spring-boot-starter-parent:Spring Boot父级依赖
提供Maven默认依赖
可以被覆盖,如何?
知识点:
maven单继承的问题?scope=import来解决
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.3.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
此时如何解决覆盖默认依赖项的问题?
spring-boot-maven-plugin:
将项目打包成一个可执行的超级jar java -jar运行
搜索主方法作为程序入口
@SpringBootApplication SpringBoot核心注解,开启自动配置
@RestController == @[email protected]
@PathVarible
知识点:Mac上maven的配置
1.$ touch ~/.bash_profile
2.$ vim ~/.bash_profile
M2_HOME=/Users/zeng/Documents/Maven/apache-maven-3.3.9
PATH=$PATH:$M2_HOME/bin
export M2_HOME
export PATH
3.$ source ~/.bash_profile (不会有输出反应)
4.$ mvn -version
Spring Boot三种运行方式:
Chapter1Application的main方法
mvn spring-boot:run 自动扫描项目找到入口
mvn package java -jar 需要很多jar包和插件
Spring Boot热部署:
1.devtools
Pom.xml中直接添加依赖即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>provided</scope>
<!--optional我没弄明白,都说必须为true,但我测试true,false,不加都可以-->
<optional>true</optional>
</dependency>
2.springloaded
Pom.xml中直接在spring-boot插件中添加依赖即可:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<dependencies>
<!-- spring热部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.6.RELEASE</version>
</dependency>
</dependencies>
<configuration>
<mainClass>cn.springboot.Mainspringboot</mainClass>
</configuration>
</plugin>
编译即可实现热部署!!!command+shit+F9
关闭回调
jackson json格式
中文木有乱码 默认UTF-8编码
SpringBoot测试:
MockMvc mvc = MockMvcBuilders.standaloneSetup(new DemoApplication()).build();
配置文件:
生效顺序:从上向下对值依次覆盖
@TestPropertySource
命令行参数
System.getProperties()
操作系统环境变量
radom.*里包含的属性会产生一个随机数
properties文件
@Configuration 类上的@PropertySource注解
默认注释,SpringApplication.setDefaultProperties指定
配置文件: 可以使用YAML代替Properties,冒号后要加个空格
配置默认端口,配置各个环境下的端口号
配置date-format和时区
随机数的玩法:
roncoo.secret=${random.value}
@Value(value = "${roncoo.secret}")
属性占位符的玩法:
roncoo.name=www.roncoo.com
roncoo.desc=${roncoo.name} is a domain name
Spring Boot日志配置
log4j(较差)、log4j2、logback
log4j:
# 日志文件名,比如:roncoo.log,或者是 /var/log/roncoo.log
logging.file=roncoo.log
# 日志级别配置,比如: logging.level.org.springframework=DEBUG
logging.level.*=info
logging.level.org.springframework=DEBUG
logback:Spring Boot默认加载classpath:logback-spring.xml或者classpath:logback-spring.groovy
<!-- 测试环境 -->
<springProfile name="test">
<!-- 每天产生一个文件 -->
<appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 文件路径 -->
<file>${TEST_FILE_PATH}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 文件名称 -->
<fileNamePattern>${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 文件最大保存历史数量 -->
<MaxHistory>100</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>${PATTERN}</pattern>
</layout>
</appender>
<root level="info">
<appender-ref ref="TEST-FILE" />
</root>
</springProfile>
log4j2:去除logback的依赖包,添加log4j2的依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 使用log4j2 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
logging.config标签
Spring Boot 模版引擎
1.模版引擎的选择:
FreeMarker
Thymeleaf
Velocity:Spring框架弃用
Groovy
Mustache
Jsp:pass 错误页面不能覆盖spring boot默认的错误页面;内嵌的Jetty不支持JSPs Undertow不支持jsps jsp只能打包成war格式,不支持jar格式
实践Freemaker:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
不能愉快的玩耍了?;success
实践thymeleaf:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
小知识点:.ftl是freemaker独有的后缀名;success
实践jsp:
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
spring.mvc.view.prefix: /WEB-INF/templates/
spring.mvc.view.suffix: .jsp
报错啦:There was an unexpected error (type=Not Found, status=404)
public class ServletInitializer extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(DemoApplication.class);
}
}
继承SpringBootServletInitializer 类似web.xml
404 why?
Spring Boot错误处理
1.Spring Boot 将所有的错误默认映射到/error, 实现ErrorController
2.添加自定义的错误页面.
resources/public/error/404.html 静态页面
templates/error/5xx.ftl 模版页面
模版页面优先于静态页面
3.使用注解@ControllerAdvice
@ExceptionHandler({ Exception.class })
@ResponseStatus(HttpStatus.OK)
public ModelAndView processException(Exception exception) {
logger.info("自定义异常处理-Exception");
ModelAndView m = new ModelAndView();
m.addObject("roncooException", exception.getMessage());
m.setViewName("error/500");
return m;
}
实验失败!!!最终成功,原因:没有在同一个包下,如何解决???
知识阅读:接口验证签名 https://www.cnblogs.com/codelir/p/5327462.html
web应用开发Servlets、filters、listeners 监听器、过滤器和servlet三种实现方式
方法1:@bean注册器注册
方法2:Application实现ServletContextInitializer,重写onStartup方法,ServletContextInitializer 接口直接注册
添加servelt、filter、listener
方法3:注解的方法,在 SpringBootApplication 上使用@ServletComponentScan 注解后,直接通过@WebServlet、 @WebFilter、@WebListener 注解自动注册
注意:SpringBoot扫描实例 @ServletComponentScan({"com.example"})
CORS支持:跨域
阅读地址:https://www.cnblogs.com/fanshuyao/p/7168471.html
/*和/**的区别
@CrossOrigin参数:origins允许访问的域列表、maxAge飞行前响应的缓存持续时间的最大年龄
ajax存在跨域问题,解决方案:
1.jsonp跨域原理:https://kb.cnblogs.com/page/139725/ 不能跨域访问的你服务器但是可以跨域访问的js脚本,通过回调来解决!!!
$.ajax({
type: "get",
async: false,
url: "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998",
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function(json){
alert('您查询到航班信息:票价: ' + json.price + ' 元,余票: ' + json.tickets + ' 张。');
},
error: function(){
alert('fail');
}
});
2.通过CrossOrigin解决
不使用注释错误提示:Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access
全局 controller类 方法
@Configuration
public class CustomCorsConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 限制了路径和域名的访问
//registry.addMapping("/api/**").allowedOrigins("http://localhost:8080");
}
};
}
}
文件上传:
Spring Boot 默认使用 springMVC 包装好的解析器进行上传
出错信息:The field roncooFile exceeds its maximum permitted size of 1048576 bytes.
配置信息:
spring.http.multipart.enabled=true #默认支持文件上传.
spring.http.multipart.file-size-threshold=0 #支持文件写入磁盘.
spring.http.multipart.location= # 上传文件的临时目录
spring.http.multipart.max-file-size=1Mb # 最大支持文件大小
spring.http.multipart.max-request-size=10Mb # 最大支持请求大小
持久层
JdbcTemplate模版
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
<dependency>
<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope>
</dependency>
配置
spring.datasource.url=jdbc:mysql://localhost/spring_boot_demo?useUnicode=true&character
Encoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
JPA java持久层api 使用hibernate
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
<dependency>
<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope>
</dependency>
JPA配置:
# JPA spring.jpa.hibernate.ddl-auto= update 每次启动自动更新数据库
#显示 sql 语句 spring.jpa.show-sql=true
很好的封装hibernate,三种查询方式:内置方法 根据方法名称自动查询 @query注解 -->优先级问题
封装分页查询:PageRequest
事物处理:ACID 7种传播行为 隔离级别
@Transactional:
isolation隔离级别 noRollbackFor指定异常不回滚 noRollbackForClassName多个异常不回滚
propagation传播属性 readOnly只读优化。 rollbackFor遇到指定异常回滚 rollbackForClassName遇到多个异常之一回滚
timeout事务的超时时常
h2嵌入式数据库的使用,SpringBoot内置数据库
依赖:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
配置:
spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE;DB_CLOSE _ON_EXIT=FALSE
spring.datasource.username=
spring.datasource.password=
pring.datasource.url=jdbc:h2:mem:test 内存模式
控制台:http://localhost:8080/h2-console 页面太丑
非关系型数据库redis的使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置文件:
spring.redis.host=localhost
spring.redis.port=6379
@Autowired
private StringRedisTemplate stringRedisTemplate;
非关系型数据库mongoDB的使用
<dependency>
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
配置
spring.data.mongodb.uri=mongodb://localhost/test
spring.data.mongodb.port=27017
使用方式:模版mongoTemplate.updateMulti(query, update, RoncooUser.class); jpa:public interface RoncooUserLogMongoDao extends MongoRepository<RoncooUserLog, Integer>
嵌入式mongodb的使用:
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
</dependency>
Mybatis:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
基于注解的开发
基于xml的开发
缓存的使用
EnCache
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId> </dependency>
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId>
</dependency>
配置:
<cache name="roncooCache"
eternal="false" 是否存在过期是阿金
maxEntriesLocalHeap="0" 最大缓存数
timeToIdleSeconds="200"></cache> 缓存超时
启动注解:@EnableCaching Application入口上注入
注解解释:@CacheCOnfig缓存配置
@Cacheable 应用到读取方法上
@CachePut 更新和插入方法
@CacheEvict 清楚缓存使用于清除
Caching-Redis的使用:自定义缓存管理器的实现
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
配置文件:spring.cache.type=redis
操作失败了!!!!!!!
MQ的使用
ActiveMq的使用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
配置:spring.activemq.in-memory=true
开启mq:@EnableJms
加入到队列,队列消耗
Rabbit Mq:安装
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
代理:
调用rest服务使用代理
添加依赖:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
代理的实现:
static class ProxyCustomizer implements RestTemplateCustomizer {
@Override
public void customize(RestTemplate restTemplate) {
String proxyHost = "43.255.104.179";
int proxyPort = 8080;
HttpHost proxy = new HttpHost(proxyHost, proxyPort);
HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
@Override
public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context)
throws HttpException {
System.out.println(target.getHostName());
return super.determineProxy(target, request, context);
}
}).build();
HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
httpClient);
httpComponentsClientHttpRequestFactory.setConnectTimeout(10000);
httpComponentsClientHttpRequestFactory.setReadTimeout(60000);
restTemplate.setRequestFactory(httpComponentsClientHttpRequestFactory);
}
}
发送模版短信:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置:
spring.mail.host=smtp.exmail.qq.com
spring.mail.password=Hepan10086
spring.mail.properties.mail.smtp.auth=true
核心代码:
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
InternetAddress from = new InternetAddress();
from.setAddress(javaMailSender.getUsername());
from.setPersonal("龙果学院", "UTF-8");
helper.setFrom(from);
helper.setTo(email);
helper.setSubject("测试邮件");
helper.setText(text, true);
javaMailSender.send(message);
return text;
swagger的使用:
依赖:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.6.0</version>
</dependency>
配置。。。。
注解说明:@APiIgnore @ApiOperation(value = "查找", notes = "根据用户 ID 查找用户")
@ApiImplicitParams({ @ApiImplicitParam(paramType = "query", dataType = "Long", name = "id", value = "信息id", required = true) }
@ApiResponses({ @ApiResponse(code = CommonStatus.OK, message = "操作成功"),
@ApiResponse(code = CommonStatus.EXCEPTION, message = "服务器内部异常"),
@ApiResponse(code = CommonStatus.FORBIDDEN, message = "权限不足") })
@ApiModel
@ApiModelProperty
用于生成api文档
待深入学习:
Druid的使用
session集群
远程调试:本地调用非本地的环境进行调试、两个VM之间通过socket协议进行通信
生产部署如何使用脚本
SpringBoot是如何实现监控的。。。。。
以上是关于我的SpringBoot实践笔记的主要内容,如果未能解决你的问题,请参考以下文章