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閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容