}
@Validated 校驗器:
@RequestMapping(path = “/owners/{ownerId}/pets/{petId}/edit”, method = RequestMethod.POST)
public String processSubmit(@Validated @ModelAttribute(“pet”) Pet pet, BindingResult result) {
if (result.hasErrors()) {
return "petForm";
}
// ...
}
自定義校驗器:
@RequestMapping(path = “/owners/{ownerId}/pets/{petId}/edit”, method = RequestMethod.POST)
public String processSubmit(@ModelAttribute(“pet”) Pet pet, BindingResult result) {
// 自己編寫一個校驗方法來處理 result 對象
new PetValidator().validate(pet, result);
if (result.hasErrors()) {
return "petForm";
}
// ...
}
四、選擇器
-----
@Conditional,當指定的條件都滿足時,元件才被注冊
@ConditionalOnBean,指定bean在上下文中時,才注冊目前bean。用在方法上,則預設依賴類為方法的傳回類型
@ConditionalOnClass,指定類在classpath上時,才初始化目前bean。用在方法上,則預設依賴類為方法的傳回類型
@ConditionalOnCloudPlatform,在指定雲平台才注冊配置
@ConditionalOnExpression,指定spel為true時注冊配置
@ConditionalOnJava,在指定java版本時注冊配置
@ConditionalOnJndi
@ConditionalOnMissingBean,指定bean不在上下文中時,才初始化目前bean。用在方法上,則預設依賴類為方法的傳回類型
@ConditionalOnMissingClass,指定類不在classpath上時,才初始化目前bean。用在方法上,則預設依賴類為方法的傳回類型
@ConditionalOnNotWebApplication,不是在web環境才注冊配置
@ConditionalOnProperty,配置檔案中的值與指定值是否相等,相等才注冊配置
@ConditionalOnResource,指定resources都在classpath上才注冊配置
@ConditionalOnSingleCandidate,上下文中隻有一個候選者bean時才注冊配置
@ConditionalOnWebApplication,是在web環境才注冊配置
五、緩存
----
@EnableCaching,開啟緩存配置,支援子類代理或者AspectJ增強
@CacheConfig,在一個類下,提供公共緩存配置
@Cacheable,放着方法和類上,緩存方法或類下所有方法的傳回值
@CachePut,每次先執行方法,再将結果放入緩存
@CacheEvict,删除緩存
@Caching,可以配置@Cacheable、@CachePut、@CacheEvict
六、定時器
-----
@EnableScheduling,開啟定時任務功能
@Scheduled,按指定執行周期執行方法
@Schedules,包含多個@Scheduled,可同時運作多個周期配置
@EnableAsync,開啟方法異步執行的能力,通過@Async或者自定義注解找到需要異步執行的方法。通過實作AsyncConfigurer接口的getAsyncExecutor()和getAsyncUncaughtExceptionHandler()方法自定義Executor和異常處理。
@Async,标記方法為異步線程中執行
七、注入配置檔案properties
------------------
@EnableConfigurationProperties,啟動@ConfigurationProperties功能
@ConfigurationProperties,将properties檔案裡的内容,自動注入bean對應的屬性中
@DeprecatedConfigurationProperty,用在配置檔案的getter()方法上,标記字段已經過期,并提示替換的字段。一般給spring-boot-configuration-processor使用。
@NestedConfigurationProperty,标記在配置檔案的字段上,提示spring-boot-configuration-processor,配置包含嵌套的配置。
spring-configuration-metadata.json 提供配置的元資訊,在寫properties配置時,會有文法提示。在項目中引入spring-boot-configuration-processor項目,會掃描@ConfigurationProperties注解,自動生成spring-configuration-metadata.json
八、Jpa
-----
### 1、@Entity ,@Table(name="")
表明這是一個實體類,一般用于jpa,這兩個注解一塊使用,但是如果表名和實體類名相同的話,@Table可以省略。
### 2、@MappedSuperClass
基于代碼複用和模型分離的思想,在項目開發中使用jpa的@MappedSuperClass注解,将實體類的多個屬性分别封裝到不同的非實體類中。例如,資料庫表中都需要id來表示編号,id是這些映射實體類的通用屬性,交給jpa統一生産主鍵id編号,那麼使用一個父類來封裝這些通用屬性,并用@MappedSuperClass辨別。
注意:
* 标注為@MappedSuperClass的類将不是一個完整的實體類,它将不會映射到資料庫表,但是它的屬性都映射到其子類的資料庫字段中。
* 标注@MappedSuperClass的類不能再标注@#Entity或@Table注解,也無需實作序列化接口。
### 3、@NoRepositoryBean
一般用做父類的repository,有這個注解,spring不會去執行個體化該repository。
### 4、@Column
如果字段名和列名相同,則可以省略。
### 5、@Id
表示該屬性為主鍵。
### 6、@Transient
表示該屬性并非一個到資料庫表的字段的映射,ORM架構将忽略該屬性。
如果一個屬性并非資料庫表的字段映射,就務必将其标注為@Transient,否則,ORM架構預設将其注解為@Basic。
### 7、@Basic
@Basic 是實體類與資料庫字段映射時最簡單的類型。
類型支援Java基本類型(byte、short、int、long、float、double、char、boolean),包裝類,枚舉類,以及實作了serializable接口的類型。
@basic注解有兩個屬性:
* fetch用來指定屬性的加載機制
有兩個選項:EAGER(即時加載,預設值)和LAZY(懶加載),即時加載意味着當執行個體化對象的時候必須加載該屬性值,懶加載是指當執行個體化對象時不加載該對象,隻有當調用該屬性時才加載。
* optional用來指定屬性是否可空
有兩個選項:true(可空,預設值)和false
如果你的實體類上不加@Basic注解,它也會自動加上@Basic,并使用預設值。
### 8、@JsonIgnore
在實體類向前台傳回資料時用來忽略不想傳遞給前台的屬性或接口。
Bean實體中會有某些運維字段,傳回資訊給前台的時候,不希望将對應值一并傳回。此時可以在對應屬性上加上@JsonIgnore,或者可以在User類上加上注解@JsonIgnoreProperties(value="{password}")
### 9、@JoinColumn、@OneToOne、@OneToMany、@ManyToOne
九、導入配置檔案
--------
1、@PropertySource
引入單個properties檔案:
@PropertySource(value = {“classpath:xxxx/xxxx.properties”})
引入多個properties檔案
@PropertySource(value = {“classpath:xxxx/xxxx.properties”,“classpath:xxxx/xxxx.properties”})
2、 @ImportResource導入xml配置檔案
可以分為兩種模式,相對路徑的classpath,絕對路徑的file。
注意:單檔案可以不寫value或locations。
取值:使用@Value注解取配置檔案中的值
@Value("${properties中的鍵}")
private String xxx;
3、@Import導入額外的配置檔案
功能類似XML配置的,用來導入配置類,可以導入帶有@Configuration注解的配置類或實作了ImportSelector/ImportBeanDefinitionRegistrar。
@SpringBootApplication
@Import({SmsConfig.class})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
十、事務注解
------
@Transactional
在Spring中,事務有兩種實作,分别是程式設計式事務和聲明式事務。
程式設計式事務:
程式設計式事務使用TransationTemplate或者直接使用底層的PlatformTransactionManager。對于程式設計式事務,spring推薦使用TransationTemplate。
聲明式事務:
建立在AOP基礎上,其本質是對方法前後進行攔截,然後再目标方法開始之前建立或者加入一個事務,在執行完目标方法之後根據執行情況送出或者復原事務,通過@Transactional就可以進行事務操作,更快捷而且簡單。推薦使用。
十一、Spring Cloud
---------------
### 1、@EnableEurekaServer
用在springboot啟動類上,表示這是一個eureka服務注冊中心;
### 2、@EnableDiscoveryClient
用在springboot啟動類上,表示這是一個服務,可以被注冊中心找到;
### 3、@LoadBalanced
開啟負載均衡能力;
### 4、@EnableCircuitBreaker
用在啟動類上,開啟斷路器功能;
### 5、@HystrixCommand(fallbackMethod=”backMethod”)
用在方法上,fallbackMethod指定斷路回調方法;
### 6、@EnableConfigServer
用在啟動類上,表示這是一個配置中心,開啟Config Server;
### 7、@EnableZuulProxy
開啟zuul路由,用在啟動類上;
### 8、@SpringCloudApplication
* @SpringBootApplication
* @EnableDiscovertyClient
* @EnableCircuitBreaker
分别是SpringBoot注解、注冊服務中心Eureka注解、斷路器注解。對于SpringCloud來說,這是每一微服務必須應有的三個注解,是以才推出了@SpringCloudApplication這一注解集合。
### 9、@ConfigurationProperties
(1)@ConfigurationProperties注解簡介
Spring源碼中大量使用了ConfigurationProperties注解,比如server.port就是由該注解擷取到的,通過與其他注解配合使用,能夠實作Bean的按需配置。
該注解有一個prefix屬性,通過指定的字首,綁定配置檔案中的配置,該注解可以放在類上,也可以放在方法上。
(2)代碼執行個體
spring.datasource.url=jdbc:mysql://127.0.0.1:8888/test?useUnicode=false&autoReconnect=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
@ConfigurationProperties(prefix = "spring.datasource")
@Component
public class DatasourcePro {
private String url;
private String username;
private String password;
// 配置檔案中是driver-class-name, 轉駝峰命名便可以綁定成
private String driverClassName;
private String type;
...
}
```
### 最後
**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視訊】](https://codechina.csdn.net/m0_60958482/java-p7)**
### ActiveMQ消息中間件面試專題
* 什麼是ActiveMQ?
* ActiveMQ伺服器當機怎麼辦?
* 丢消息怎麼辦?
* 持久化消息非常慢怎麼辦?
* 消息的不均勻消費怎麼辦?
* 死信隊列怎麼辦?
* ActiveMQ中的消息重發時間間隔和重發次數嗎?
**ActiveMQ消息中間件面試專題解析拓展:**

* * *
# redis面試專題及答案
* 支援一緻性哈希的用戶端有哪些?
* Redis與其他key-value存儲有什麼不同?
* Redis的記憶體占用情況怎麼樣?
* 都有哪些辦法可以降低Redis的記憶體使用情況呢?
* 檢視Redis使用情況及狀态資訊用什麼指令?
* Redis的記憶體用完了會發生什麼?
* Redis是單線程的,如何提高多核CPU的使用率?

* * *
# **Spring面試專題及答案**
* 談談你對 Spring 的了解
* Spring 有哪些優點?
* Spring 中的設計模式
* 怎樣開啟注解裝配以及常用注解
* 簡單介紹下 Spring bean 的生命周期
**Spring面試答案解析拓展**

* * *
# 高并發多線程面試專題
* 現在有線程 T1、T2 和 T3。你如何確定 T2 線程在 T1 之後執行,并且 T3 線程在 T2 之後執行?
* Java 中新的 Lock 接口相對于同步代碼塊(synchronized block)有什麼優勢?如果讓你實作一個高性能緩存,支援并發讀取和單一寫入,你如何保證資料完整性。
* Java 中 wait 和 sleep 方法有什麼差別?
* 如何在 Java 中實作一個阻塞隊列?
* 如何在 Java 中編寫代碼解決生産者消費者問題?
* 寫一段死鎖代碼。你在 Java 中如何解決死鎖?
**高并發多線程面試解析與拓展**

* * *
# jvm面試專題與解析
* JVM 由哪些部分組成?
* JVM 記憶體劃分?
* Java 的記憶體模型?
* 引用的分類?
* GC什麼時候開始?
**JVM面試專題解析與拓展!**

Spring bean 的生命周期
**Spring面試答案解析拓展**
[外鍊圖檔轉存中...(img-BPLgEL06-1630913536300)]
* * *
# 高并發多線程面試專題
* 現在有線程 T1、T2 和 T3。你如何確定 T2 線程在 T1 之後執行,并且 T3 線程在 T2 之後執行?
* Java 中新的 Lock 接口相對于同步代碼塊(synchronized block)有什麼優勢?如果讓你實作一個高性能緩存,支援并發讀取和單一寫入,你如何保證資料完整性。
* Java 中 wait 和 sleep 方法有什麼差別?
* 如何在 Java 中實作一個阻塞隊列?
* 如何在 Java 中編寫代碼解決生産者消費者問題?
* 寫一段死鎖代碼。你在 Java 中如何解決死鎖?
**高并發多線程面試解析與拓展**
[外鍊圖檔轉存中...(img-pBeIUCYn-1630913536302)]
* * *
# jvm面試專題與解析
* JVM 由哪些部分組成?
* JVM 記憶體劃分?
* Java 的記憶體模型?
* 引用的分類?
* GC什麼時候開始?
**JVM面試專題解析與拓展!**
[外鍊圖檔轉存中...(img-2BqiaP0N-1630913536303)]