天天看點

Spring Boot常用注解(絕對經典,9000字通俗易懂的講解下Java注解

}

@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消息中間件面試專題解析拓展:**

![BAT面試文檔:ActiveMQ+redis+Spring+高并發多線程+JVM](https://img-blog.csdnimg.cn/img_convert/8efa9a2953ecb956b70cefd577a9129c.png)

* * *

# redis面試專題及答案

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

![BAT面試文檔:ActiveMQ+redis+Spring+高并發多線程+JVM](https://img-blog.csdnimg.cn/img_convert/b45eb8f2023a61c83f1e1c3143f1ba5a.png)

* * *

# **Spring面試專題及答案**

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

**Spring面試答案解析拓展**

![BAT面試文檔:ActiveMQ+redis+Spring+高并發多線程+JVM](https://img-blog.csdnimg.cn/img_convert/cb59884f4c4079976be33cc3bb2bcd67.png)

* * *

# 高并發多線程面試專題

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

**高并發多線程面試解析與拓展**

![BAT面試文檔:ActiveMQ+redis+Spring+高并發多線程+JVM](https://img-blog.csdnimg.cn/img_convert/be8acb44f45db0641d658317959d642c.png)

* * *

# jvm面試專題與解析

*   JVM 由哪些部分組成?
*   JVM 記憶體劃分?
*   Java 的記憶體模型?
*   引用的分類?
*   GC什麼時候開始?

**JVM面試專題解析與拓展!**

![BAT面試文檔:ActiveMQ+redis+Spring+高并發多線程+JVM](https://img-blog.csdnimg.cn/img_convert/3f8cee2db0c7431645e37921121b2ea9.png)
 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)]