我的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

[email protected]

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是如何实现监控的。。。。。

原文地址:http://blog.51cto.com/13496382/2091348

时间: 2024-11-09 10:19:12

我的SpringBoot实践笔记的相关文章

SpringBoot实践 - SpringBoot+mysql

关于springBoot是个神马东西以及优缺点,请自行搜索了解. LZ看到很多关于SpringBoot的Demo,单看一篇总是没法整合SpringBoot与Mysql.没法子,还是自己操刀来一发为妙. 本文将叙述关于SpringBoot与mysql整合实践. 1.Eclipse 整合SpringBoot插件.(此步骤非常耗时,LZ本身尝试了多次.请在网络环境优情况下下进行操作) a.Eclipse 安装STS插件: eclipse->help->Eclipse Marketplace b.检测

hadoop2.5.2学习及实践笔记(四)—— namenode启动过程源码概览

对namenode启动时的相关操作及相关类有一个大体了解,后续深入研究时,再对本文进行补充 >实现类 HDFS启动脚本为$HADOOP_HOME/sbin/start-dfs.sh,查看start-dfs.sh可以看出,namenode是通过bin/hdfs命令来启动 $ vi start-dfs.sh # namenodes NAMENODES=$($HADOOP_PREFIX/bin/hdfs getconf -namenodes) echo "Starting namenodes o

PHP核心技术与最佳实践--笔记

<?php error_reporting(E_ALL); /* php 5.3引入 延迟静态绑定 */ /* php5.4引入trait,用来实现多层继承 trait Hello{} trait World{} class MyHelloWorld{ use Hello,World; } */ /* php4时代 php是不支持析构函数的*/ /* php中数组索引是字符串,但是没有使用引号,php就将其认为是一个常量,找不到在视为变量 */ /** * php中的异常必须手动 * 可以结合错

udacity android 实践笔记: lesson 4 part a

udacity android 实践笔记: lesson 4 part a 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八(短信最佳) 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/mast

udacity android 实践笔记: lesson 4 part b

udacity android 实践笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 联系:1307316一九六八(短信最佳) 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. tips:https://code.csdn.net/titer1/pat_aha/blob/mast

COMET探索系列一【COMET实践笔记】

转:http://www.cnblogs.com/hackboy/p/3687627.html COMET探索系列一[COMET实践笔记] 这几天在给公司的一个点对点聊天系统升级,之前只是使用简单的ajax轮询方式实现,每5秒钟取一次数据,延时太长,用户体验不是很好,因此打算采用服务器推送技术,故此整理了以下文档,将自己找到的一些资料及心得与大家在此分享.本文主要综述了Comet相关的概念.应用场景.常用的两种实现模型.及PHP实现代码. 概    念:Comet,基于 HTTP 长连接的“服务

SpringBoot学习笔记(5):处理前端JSON返回的日期的格式

SpringBoot学习笔记(4):处理前端JSON返回的日期的格式 问题描述 前端页面显示的时间为毫秒格式,不利于直观显示! 解决方法1--后端解决 public class Flow { @JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8") private Date flow_date; ..... } 解决方法2--JS处理 function crtTimeFtt(val, row) { if (val !

SpringBoot学习笔记(1):配置Mybatis

SpringBoot学习笔记(1):配置Mybatis 参考资料: 1.AndyLizh的博客 2.xiaolyuh123的博客 快速开始 添加Mybatis依赖(其他依赖已省去) <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId

Springboot学习笔记

Springboot学习笔记(一)-线程池的简化及使用 Springboot学习笔记(二)-定时任务 Springboot学习笔记(三)-常用注入组件方式 原文地址:https://www.cnblogs.com/yw0219/p/9060331.html