SpringBoot笔记

缓存相关

重要概念&注解

image.png

image.png

image.png

使用步骤

引入spring-boot-starter-cache依赖
@EnableCaching
在SpringBoot启动器上添加注解,开启缓存。

@Cacheable
在方法上添加此注解,若不指定key则以传入参数生成key,缓存该方法的返回参数。
@CacheEvict
在方法上添加此注解,若不指定key则以传入参数生成key,删除该缓存。
@CachePut
在方法上添加此注解,若不指定key则以传入参数生成key,调用该方法后更新缓存。

使用redis缓存

引入spring-boot-starter-data-redis依赖,SpringBoot会自动切换
application.properties中添加redis主机地址:spring.redis.host=192.168.37.135

自定义使用redis

@Autowired
StringRedisTemplate stringRedisTemplate;//键值对都为String的操作器
@Autowired
RedisTemplate redisTemplate;//键值对都为对象的操作器,对象需继承序列号接口

自定义RedisTemplate可实现不同的序列化方式,默认为jdk序列化方式。
添加自定义缓存管理器(需定义泛型),在service里添加@CacheConfig(cacheManager="")注解指定缓存管理器。


自定义序列化方法

任务相关

异步任务

@Async
此注解标注在方法或类型上,可开启异步处理。

定时任务

@EnableScheduling
在SpringBoot启动器上添加注解,开启定时任务。
@Scheduled
可以在方法和注解类型上添加注解,设置任务的定时规则。


注解的使用

字段类型

字符类型

邮件任务

引入spring-boot-starter-mail

配置application.properties

spring.mail.username=xxx@qq.com
spring.mail.password=xxxx
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.smtp.ssl.enable=true

注入邮件发送bean

@Autowired
JavaMailSenderImpl mailSender;

发送简单邮件

SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("这是主题");
message.setText("这是正文"); 
message.setTo("发送给@qq.com");
message.setFrom("接收到@qq.com");
mailSender.send(message);

发送带附件的邮件

MimeMessage mimeMessage = this.mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setSubject("这是主题");
helper.setText("<b style='color:red'>这是正文</b>", true);
helper.setTo("发送给@163.com");
helper.setFrom("接收到@qq.com");
helper.addAttachment("1.jpg", new File("C:\\Users\\sc\\Pictures\\1.jpg"));
helper.addAttachment("2.jpg", new File("C:\\Users\\sc\\Pictures\\2.jpg"));
this.mailSender.send(mimeMessage);

安全相关

SpringSecurity

引入jar包
spring-boot-starter-security

创建一个配置类,继承WebSecurityConfigurerAdapter,需要注解@EnableWebSecurity开启,重写configure(HttpSecurity http)和configure(AuthenticationManagerBuilder auth)

//super.configure(http);//定制请求的授权规则

http.authorizeRequests().antMatchers("/").permitAll()
            .antMatchers("/level1/**").hasRole("VIP1")
            .antMatchers("/level2/**").hasRole("VIP2")
            .antMatchers("/level3/**").hasRole("VIP3");

//开启自动配置的登陆功能,效果,如果没有登陆,没有权限就会来到登陆页面http.formLogin().usernameParameter("user").passwordParameter("pwd").loginPage("/userlogin");
//1、/login来到登陆页
//2、重定向到/login?error表示登陆失败
//3、更多详细规定
//4、默认post形式的 /login代表处理登陆
//5、一但定制loginPage;那么 loginPage的post请求就是登陆

//开启自动配置的注销功能。
http.logout().logoutSuccessUrl("/");
//1、访问 /logout 表示用户注销,清空session
//2、注销成功会返回 /login?logout 页面;
//开启记住我功能
http.rememberMe().rememberMeParameter("remember");
//登陆成功以后,将cookie发给浏览器保存,以后访问页面带上这个cookie,只要通过检查就可以免登录
//点击注销会删除cookie

//该方法为增加可验证的用户,实际操作是从数据库获得,这里暂时放在内存,方便演示
auth.inMemoryAuthentication()
            .whthUser("U1").password("P1").roles("R1")
            .and()
            .whthUser("U2").password("P2").roles("R2");

引入依赖

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

判断是否已认证<div sec:authorize="isAuthenticated()">
获取姓名<span sec:authentication="name"></span>,
获取角色<span sec:authentication="principal.authorities"></span></h2>
根据角色判断是否展示<div sec:authorize="hasRole('VIP1')">

参考链接:https://spring.io/guides/gs/securing-web/

消息队列相关

安装RabbitMQ

docker中运行RabbitMQ服务
在网页管理端可进行交换器的创建与消息队列的创建与绑定。
交换器路由键,不同的队列

配置application.properties

spring.rabbitmq.host=118.24.44.169
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
#虚拟地址
#spring.rabbitmq.virtual-host=

发送消息

@Autowired
RabbitTemplate rabbitTemplate;
this.rabbitTemplate.convertAndSend("exchange.direct", "test.tests","this is a message");

接受消息

Object o = this.rabbitTemplate.receiveAndConvert("test.tests");
System.out.println(o.getClass());
System.out.println(o);

使用json序列化方式

image.png

使用步骤

@EnableRabbit
在SpringBoot启动器上添加注解,开启基于注解的RabbitMQ模式。

@RabbitListener(queues="test.tests")//在方法上添加该注解,接受该消息并处理。
public void receive(Book book){
System.out.println(book);
}

public void receive(Message message){
System.out.println(message.getBody());
System.out.println(message.getMessageProperties());
}
@Autowired
AmqpAdmin amqpAdmin;//通过这个类进行交换器与队列的管理

检索相关

安装Elasticsearch

docker中安装运行Elasticsearch服务,限制内存大小256MB(默认为2G)。

操作请求

地址:http://localhost:9200/testGroup/employee/1

GET请求

查询文档

PUT请求

添加文档
{
请求体
}

DELETE请求

删除文档

HEAD请求(找到则200,未找到404)

检查文档是否存在

POST请求

搜索文档
地址:http://localhost:9200/testGroup/employee/_search
{
请求体
}

使用步骤

使用jest

导入jest的jar包。

配置地址
spring.elasticsearch.jest.uris=http://118.24.44.169:9200

@Autowired
JestClient jestClient;
//添加
Book book = new Book ();
book .setId(1);
book .setName("好书");
Index index = ((Builder)((Builder)(new Builder(book )).index("test")).type("book")).build();
jestClient.execute(index);

//搜索
String json = "{\n    \"query\" : {\n        \"match\" : {\n            \"name\" : \"好\"\n        }\n    }\n}";
Search search = ((io.searchbox.core.Search.Builder)((io.searchbox.core.Search.Builder)(new io.searchbox.core.Search.Builder(json)).addIndex("atguigu")).addType("news")).build();
SearchResult result = (SearchResult)this.jestClient.execute(search);
System.out.println(result.getJsonString());

使用SpringData ElasticSearch

配置地址

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=118.24.44.169:9301

创建实体类存储器接口继承ElasticsearchRepository<T,ID>

添加文档

@Document(indexName = "test",type = "book")//在实体上设置索引和类型
pulic class book{
}

@Autowired
BookRepository bookRepository;
bookRepository.index(book);

//BookRepository 内可添加findByBookNameLike等方法查询,也支持在方法上添加@Query注解实现自己的查询表达式
for(Book book : bookRepository.findByBookNameLike("好") ){
  System.out.println(book);
}

GET /index/type/_search?q=字段:搜索值

QueryBuilder的使用:https://www.cnblogs.com/wenbronk/p/6432990.html

分布式相关

dubbo与SpringCloud的区别

Dubbo是分布式服务框架,主要解决各服务调用的问题(即RPC)。
Spring Cloud是一个分布式的整体解决方案。Spring Cloud 为开发者提供了在分布式系统(配置管理,服务发现,熔断,路由,微代理,控制总线,一次性token,全局琐,leader选举,分布式session,集群状态)中快速构建的工具,使用Spring Cloud的开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。

SpringCloud分布式开发五大常用组件

服务发现——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config

zookeeper与dubbo使用步骤

在docker内安装好zookeeper服务

引入jar包

引入dubbo的jar包

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</a rtifactId>
        <version>0.1.0<version>
</dependency>

引入zookeeper客户端的jar包

<dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</a rtifactId>
        <version>0.1<version>
</dependency>

发布服务

在application.properties里添加

dubbo.application.name=provider-ticket
dubbo.registry.address=zookeeper://118.24.44.169:2181
dubbo.scan.base-packages=com.test.ticket.service

在实现类里添加

@Component
@Service(dubbo注解)

消费服务

在application.properties里添加

dubbo.application.name=consumer-user
dubbo.registry.address=zookeeper://118.24.44.169:2181

需实现接口类

//消费时添加。 
@Reference

SpringCloud使用步骤

Eureka注册中心

添加application.yml

server:
  port: 8761
eureka:
  instance:
    hostname: eureka-server  # eureka实例的主机名
  client:
    register-with-eureka: false #不把自己注册到eureka上
    fetch-registry: false #不从eureka上来获取服务的注册信息
    service-url:
      defaultZone: http://localhost:8761/eureka/

@EnableEurekaServer
在SpringBoot启动器上添加注解,开启注册中心功能。

提供服务

添加application.yml

server:
  port: 8002
spring:
  application:
    name: provider-ticket
eureka:
  instance:
    prefer-ip-address: true # 注册服务的时候使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

消费服务

添加application.yml

spring:
  application:
    name: consumer-user
server:
  port: 8200

eureka:
  instance:
    prefer-ip-address: true # 注册服务的时候使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

@EnableDiscoveryClient
在SpringBoot启动器上添加注解,开启发现服务功能。

@LoadBalanced//负载均衡
@Bean
public RestTemplate restTemplate(){
          return new RestTemlate();
}

@Autowired
RestTemplate restTemplate;
restTemplate.gerForObject("url",String,class);

热部署相关

使用步骤

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
image.png

监控相关

使用步骤

引入spring-boot-starter-actuator依赖

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容