Spring?Boot常用注解(經(jīng)典干貨)
Spring Boot
1.為什么要使用 Spring Boot
因?yàn)镾pring, SpringMVC 需要使用的大量的配置文件 (xml文件)
還需要配置各種對(duì)象,把使用的對(duì)象放入到spring容器中才能使用對(duì)象
需要了解其他框架配置規(guī)則。
2.SpringBoot 就相當(dāng)于 不需要配置文件的Spring+SpringMVC。 常用的框架和第三方庫(kù)都已經(jīng)配置好了。
拿來(lái)就可以使用了。
3.SpringBoot開(kāi)發(fā)效率高,使用方便多了.
一、什么是Spring Boot
Spring Boot是一個(gè)快速開(kāi)發(fā)框架,快速的將一些常用的第三方依賴(lài)整合(通過(guò)Maven子父親工程的方式),簡(jiǎn)化xml配置,全部采用注解形式,內(nèi)置Http服務(wù)器(Jetty和Tomcat),最終以Java應(yīng)用程序進(jìn)行執(zhí)行。
二、Spring常用注解
三、Spring Boot常用注解
1、@SpringBootApplication
替代 @SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
2、@ImportAutoConfiguration
導(dǎo)入配置類(lèi),一般做測(cè)試的時(shí)候使用,正常優(yōu)先使用@EnableAutoConfiguration
3、@SpringBootConfiguration
替代@Configuration
4、@ImportResource
將資源導(dǎo)入容器
5、@PropertySource
導(dǎo)入properties文件
6、PropertySources
@PropertySource 的集合
7、@Role
bean角色定義為ROLE_APPLICATION(默認(rèn)值)、ROLE_SUPPORT(輔助角色)、ROLE_INFRASTRUCTURE(后臺(tái)角色,用戶(hù)無(wú)感)
8、@Scope
指定bean的作用域,默認(rèn)singleton,其它包括prototype、request、session、globalSession
9、@Lazy
使bean懶加載,取消bean預(yù)初始化。
10、@Primary
自動(dòng)裝配時(shí)當(dāng)出現(xiàn)多個(gè)Bean候選者時(shí),被注解為@Primary的Bean將作為首選者,否者將拋出異常。
11、@Profile
指定Bean在哪個(gè)環(huán)境下被激活
12、@DependsOn
依賴(lài)的bean注冊(cè)完成,才注冊(cè)當(dāng)前類(lèi),依賴(lài)bean不存在會(huì)報(bào)錯(cuò)。用于控制bean加載順序
13、@PostConstruct
bean的屬性都注入完畢后,執(zhí)行注解標(biāo)注的方式進(jìn)行初始化工作
14、@Autowired
默認(rèn)按類(lèi)型裝配,如果我們想使用按名稱(chēng)裝配,可以結(jié)合@Qualifier注解一起使用。
15、@Lookup
根據(jù)方法返回的類(lèi)型,去容器中撈出對(duì)應(yīng)
16、@Qualifier
申明bean名字,且可以按bean名字加載bean
17、@Required
檢查bean的屬性setXXX()方法,要求屬性砸死配置階段必須已配置
18、@Description
添加bean的文字描述
19、@EnableAspectConfiguration
啟動(dòng)AspectJ自動(dòng)配置
20、EnableLoadTimeWeaving
啟動(dòng)類(lèi)加載器動(dòng)態(tài)增強(qiáng)功能,使用instrumentation實(shí)現(xiàn)
21、@AutoConfigurationPackage
包含該注解的package會(huì)被AutoConfigurationPackages注冊(cè)
22、@AutoConfigureBefore
在指定配置類(lèi)初始化前加載
23、@AutoConfigureAfter
在指定配置類(lèi)初始化后加載
24、@AutoConfigureOrder
指定配置類(lèi)初始化順序,越小初始化越早
25、@ModelAttribute
@ModelAttribute
注解可被應(yīng)用在方法和方法參數(shù)上。
(1)對(duì)方法使用 @ModelAttribute 注解:
注解在方法上的@ModelAttribute
說(shuō)明了方法的作用是用于添加一個(gè)或多個(gè)屬性到model上。這樣的方法能接受與@RequestMapping
注解相同的參數(shù)類(lèi)型,只不過(guò)不能直接被映射到具體的請(qǐng)求上。
@ModelAttribute 方法會(huì)先被調(diào)用。
在同一個(gè)控制器中,注解了@ModelAttribute
的方法實(shí)際上會(huì)在@RequestMapping
方法之前被調(diào)用。以下是幾個(gè)例子:
@Controller public class ModelAttributeController { @ModelAttribute public void init(Model model) { System.out.println("@RequestMapping方法"); } @RequestMapping("/model-attribute") public String get() { System.out.println("@ModelAttribute方法"); return "model-attribute"; } }
可以使用 @ModelAttribute 標(biāo)注的方法來(lái)設(shè)置其他 @ReqeustMapping 方法的公用參數(shù)
使用 @ModelAttribute("key") 來(lái)顯示指定屬性名。
(2)@ModelAttribute 和 @RequestMapping 注解在同一個(gè)方法上
如果 @ModelAttribute 和 @RequestMapping 注解在同一個(gè)方法上,那么代表給這個(gè)請(qǐng)求單獨(dú)設(shè)置 Model 參數(shù)。此時(shí)返回的值是 Model 的參數(shù)值,而不是跳轉(zhuǎn)的地址。跳轉(zhuǎn)的地址是根據(jù)請(qǐng)求的 url 自動(dòng)轉(zhuǎn)換而來(lái)的。比如下面的例子中跳轉(zhuǎn)頁(yè)面不是 HelloWorld.jsp 而是 model-attribute.jsp。并且參數(shù)只有在 model-attribute.jsp 中能夠取得,而 demo.jsp 中不能取得。
(3)在方法參數(shù)上使用 @ModelAttribute 注解
① 數(shù)據(jù)綁定
注解在方法參數(shù)上的@ModelAttribute
說(shuō)明了該方法參數(shù)的值將由model中取得。如果model中找不到,那么該參數(shù)會(huì)先被實(shí)例化,然后被添加到model中。在model中存在以后,請(qǐng)求中所有名稱(chēng)匹配的參數(shù)都會(huì)填充到該參數(shù)中。這在Spring MVC中被稱(chēng)為數(shù)據(jù)綁定,一個(gè)非常有用的特性,節(jié)約了你每次都需要手動(dòng)從表格數(shù)據(jù)中轉(zhuǎn)換這些字段數(shù)據(jù)的時(shí)間。
② 和 BindingResult 配合使用
使用 @ModelAttribute
進(jìn)行數(shù)據(jù)綁定之后,可以使用 BindingResult
來(lái)返回?cái)?shù)據(jù)驗(yàn)證結(jié)果。數(shù)據(jù)驗(yàn)證可以使用 hibernate validation 的 @Valid
標(biāo)簽或者 spring Validator 校驗(yàn)機(jī)制的 @Validated
配合 BindingResult 使用。 或者自定義校驗(yàn)器來(lái)返回 BindingResult 對(duì)象來(lái)進(jìn)行校驗(yàn)。你可以通過(guò)Spring的 <errors>
表單標(biāo)簽來(lái)在同一個(gè)表單上顯示錯(cuò)誤信息。
@Valid 校驗(yàn)器:
@RequestMapping(path = "/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST) public String processSubmit(@Valid @ModelAttribute("pet") Pet pet, BindingResult result) { if (result.hasErrors()) { return "petForm"; } // ... }
@Validated 校驗(yàn)器:
@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"; } // ... }
自定義校驗(yàn)器:
@RequestMapping(path = "/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.POST) public String processSubmit(@ModelAttribute("pet") Pet pet, BindingResult result) { // 自己編寫(xiě)一個(gè)校驗(yàn)方法來(lái)處理 result 對(duì)象 new PetValidator().validate(pet, result); if (result.hasErrors()) { return "petForm"; } // ... }
四、選擇器
@Conditional,當(dāng)指定的條件都滿(mǎn)足時(shí),組件才被注冊(cè)
@ConditionalOnBean,指定bean在上下文中時(shí),才注冊(cè)當(dāng)前bean。用在方法上,則默認(rèn)依賴(lài)類(lèi)為方法的返回類(lèi)型
@ConditionalOnClass,指定類(lèi)在classpath上時(shí),才初始化當(dāng)前bean。用在方法上,則默認(rèn)依賴(lài)類(lèi)為方法的返回類(lèi)型
@ConditionalOnCloudPlatform,在指定云平臺(tái)才注冊(cè)配置
@ConditionalOnExpression,指定spel為true時(shí)注冊(cè)配置
@ConditionalOnJava,在指定java版本時(shí)注冊(cè)配置
@ConditionalOnJndi
@ConditionalOnMissingBean,指定bean不在上下文中時(shí),才初始化當(dāng)前bean。用在方法上,則默認(rèn)依賴(lài)類(lèi)為方法的返回類(lèi)型
@ConditionalOnMissingClass,指定類(lèi)不在classpath上時(shí),才初始化當(dāng)前bean。用在方法上,則默認(rèn)依賴(lài)類(lèi)為方法的返回類(lèi)型
@ConditionalOnNotWebApplication,不是在web環(huán)境才注冊(cè)配置
@ConditionalOnProperty,配置文件中的值與指定值是否相等,相等才注冊(cè)配置
@ConditionalOnResource,指定resources都在classpath上才注冊(cè)配置
@ConditionalOnSingleCandidate,上下文中只有一個(gè)候選者bean時(shí)才注冊(cè)配置
@ConditionalOnWebApplication,是在web環(huán)境才注冊(cè)配置
五、緩存
@EnableCaching,開(kāi)啟緩存配置,支持子類(lèi)代理或者AspectJ增強(qiáng)
@CacheConfig,在一個(gè)類(lèi)下,提供公共緩存配置
@Cacheable,放著方法和類(lèi)上,緩存方法或類(lèi)下所有方法的返回值
@CachePut,每次先執(zhí)行方法,再將結(jié)果放入緩存
@CacheEvict,刪除緩存
@Caching,可以配置@Cacheable、@CachePut、@CacheEvict
六、定時(shí)器
@EnableScheduling,開(kāi)啟定時(shí)任務(wù)功能
@Scheduled,按指定執(zhí)行周期執(zhí)行方法
@Schedules,包含多個(gè)@Scheduled,可同時(shí)運(yùn)行多個(gè)周期配置
@EnableAsync,開(kāi)啟方法異步執(zhí)行的能力,通過(guò)@Async或者自定義注解找到需要異步執(zhí)行的方法。通過(guò)實(shí)現(xiàn)AsyncConfigurer接口的getAsyncExecutor()和getAsyncUncaughtExceptionHandler()方法自定義Executor和異常處理。
@Async,標(biāo)記方法為異步線程中執(zhí)行
七、注入配置文件properties
@EnableConfigurationProperties,啟動(dòng)@ConfigurationProperties功能
@ConfigurationProperties,將properties文件里的內(nèi)容,自動(dòng)注入bean對(duì)應(yīng)的屬性中
@DeprecatedConfigurationProperty,用在配置文件的getter()方法上,標(biāo)記字段已經(jīng)過(guò)期,并提示替換的字段。一般給spring-boot-configuration-processor使用。
@NestedConfigurationProperty,標(biāo)記在配置文件的字段上,提示spring-boot-configuration-processor,配置包含嵌套的配置。
spring-configuration-metadata.json 提供配置的元信息,在寫(xiě)properties配置時(shí),會(huì)有語(yǔ)法提示。在項(xiàng)目中引入spring-boot-configuration-processor項(xiàng)目,會(huì)掃描@ConfigurationProperties注解,自動(dòng)生成spring-configuration-metadata.json
八、Jpa
1、@Entity ,@Table(name="")
表明這是一個(gè)實(shí)體類(lèi),一般用于jpa,這兩個(gè)注解一塊使用,但是如果表名和實(shí)體類(lèi)名相同的話,@Table可以省略。
2、@MappedSuperClass
基于代碼復(fù)用和模型分離的思想,在項(xiàng)目開(kāi)發(fā)中使用jpa的@MappedSuperClass注解,將實(shí)體類(lèi)的多個(gè)屬性分別封裝到不同的非實(shí)體類(lèi)中。例如,數(shù)據(jù)庫(kù)表中都需要id來(lái)表示編號(hào),id是這些映射實(shí)體類(lèi)的通用屬性,交給jpa統(tǒng)一生產(chǎn)主鍵id編號(hào),那么使用一個(gè)父類(lèi)來(lái)封裝這些通用屬性,并用@MappedSuperClass標(biāo)識(shí)。
注意:
- 標(biāo)注為@MappedSuperClass的類(lèi)將不是一個(gè)完整的實(shí)體類(lèi),它將不會(huì)映射到數(shù)據(jù)庫(kù)表,但是它的屬性都映射到其子類(lèi)的數(shù)據(jù)庫(kù)字段中。
- 標(biāo)注@MappedSuperClass的類(lèi)不能再標(biāo)注@#Entity或@Table注解,也無(wú)需實(shí)現(xiàn)序列化接口。
3、@NoRepositoryBean
一般用做父類(lèi)的repository,有這個(gè)注解,spring不會(huì)去實(shí)例化該repository。
4、@Column
如果字段名和列名相同,則可以省略。
5、@Id
表示該屬性為主鍵。
6、@Transient
表示該屬性并非一個(gè)到數(shù)據(jù)庫(kù)表的字段的映射,ORM框架將忽略該屬性。
如果一個(gè)屬性并非數(shù)據(jù)庫(kù)表的字段映射,就務(wù)必將其標(biāo)注為@Transient,否則,ORM框架默認(rèn)將其注解為@Basic。
7、@Basic
@Basic 是實(shí)體類(lèi)與數(shù)據(jù)庫(kù)字段映射時(shí)最簡(jiǎn)單的類(lèi)型。
類(lèi)型支持Java基本類(lèi)型(byte、short、int、long、float、double、char、boolean),包裝類(lèi),枚舉類(lèi),以及實(shí)現(xiàn)了serializable接口的類(lèi)型。
@basic注解有兩個(gè)屬性:
- fetch用來(lái)指定屬性的加載機(jī)制
有兩個(gè)選項(xiàng):EAGER(即時(shí)加載,默認(rèn)值)和LAZY(懶加載),即時(shí)加載意味著當(dāng)實(shí)例化對(duì)象的時(shí)候必須加載該屬性值,懶加載是指當(dāng)實(shí)例化對(duì)象時(shí)不加載該對(duì)象,只有當(dāng)調(diào)用該屬性時(shí)才加載。
- optional用來(lái)指定屬性是否可空
有兩個(gè)選項(xiàng):true(可空,默認(rèn)值)和false
如果你的實(shí)體類(lèi)上不加@Basic注解,它也會(huì)自動(dòng)加上@Basic,并使用默認(rèn)值。
8、@JsonIgnore
在實(shí)體類(lèi)向前臺(tái)返回?cái)?shù)據(jù)時(shí)用來(lái)忽略不想傳遞給前臺(tái)的屬性或接口。
Bean實(shí)體中會(huì)有某些運(yùn)維字段,返回信息給前臺(tái)的時(shí)候,不希望將對(duì)應(yīng)值一并返回。此時(shí)可以在對(duì)應(yīng)屬性上加上@JsonIgnore,或者可以在User類(lèi)上加上注解@JsonIgnoreProperties(value="{password}")
9、@JoinColumn、@OneToOne、@OneToMany、@ManyToOne
九、導(dǎo)入配置文件
1、@PropertySource
引入單個(gè)properties文件:
@PropertySource(value = {"classpath:xxxx/xxxx.properties"})
引入多個(gè)properties文件
@PropertySource(value = {"classpath:xxxx/xxxx.properties","classpath:xxxx/xxxx.properties"})
2、 @ImportResource導(dǎo)入xml配置文件
可以分為兩種模式,相對(duì)路徑的classpath,絕對(duì)路徑的file。
注意:?jiǎn)挝募梢圆粚?xiě)value或locations。
取值:使用@Value注解取配置文件中的值
@Value("${properties中的鍵}") private String xxx;
3、@Import導(dǎo)入額外的配置文件
功能類(lèi)似XML配置的,用來(lái)導(dǎo)入配置類(lèi),可以導(dǎo)入帶有@Configuration注解的配置類(lèi)或?qū)崿F(xiàn)了ImportSelector/ImportBeanDefinitionRegistrar。
@SpringBootApplication @Import({SmsConfig.class}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
十、事務(wù)注解
@Transactional
在Spring中,事務(wù)有兩種實(shí)現(xiàn),分別是編程式事務(wù)和聲明式事務(wù)。
編程式事務(wù):
編程式事務(wù)使用TransationTemplate或者直接使用底層的PlatformTransactionManager。對(duì)于編程式事務(wù),spring推薦使用TransationTemplate。
聲明式事務(wù):
建立在AOP基礎(chǔ)上,其本質(zhì)是對(duì)方法前后進(jìn)行攔截,然后再目標(biāo)方法開(kāi)始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù),通過(guò)@Transactional就可以進(jìn)行事務(wù)操作,更快捷而且簡(jiǎn)單。推薦使用。
十一、Spring Cloud
1、@EnableEurekaServer
用在springboot啟動(dòng)類(lèi)上,表示這是一個(gè)eureka服務(wù)注冊(cè)中心;
2、@EnableDiscoveryClient
用在springboot啟動(dòng)類(lèi)上,表示這是一個(gè)服務(wù),可以被注冊(cè)中心找到;
3、@LoadBalanced
開(kāi)啟負(fù)載均衡能力;
4、@EnableCircuitBreaker
用在啟動(dòng)類(lèi)上,開(kāi)啟斷路器功能;
5、@HystrixCommand(fallbackMethod=”backMethod”)
用在方法上,fallbackMethod指定斷路回調(diào)方法;
6、@EnableConfigServer
用在啟動(dòng)類(lèi)上,表示這是一個(gè)配置中心,開(kāi)啟Config Server;
7、@EnableZuulProxy
開(kāi)啟zuul路由,用在啟動(dòng)類(lèi)上;
8、@SpringCloudApplication
- @SpringBootApplication
- @EnableDiscovertyClient
- @EnableCircuitBreaker
分別是SpringBoot注解、注冊(cè)服務(wù)中心Eureka注解、斷路器注解。
對(duì)于SpringCloud來(lái)說(shuō),這是每一微服務(wù)必須應(yīng)有的三個(gè)注解,所以才推出了@SpringCloudApplication這一注解集合。
9、@ConfigurationProperties
(1)@ConfigurationProperties注解簡(jiǎn)介
Spring源碼中大量使用了ConfigurationProperties注解,比如server.port就是由該注解獲取到的,通過(guò)與其他注解配合使用,能夠?qū)崿F(xiàn)Bean的按需配置。
該注解有一個(gè)prefix屬性,通過(guò)指定的前綴,綁定配置文件中的配置,該注解可以放在類(lèi)上,也可以放在方法上。
(2)代碼實(shí)例
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, 轉(zhuǎn)駝峰命名便可以綁定成 private String driverClassName; private String type; ... }
以上代碼就實(shí)現(xiàn)了通過(guò)配置文件對(duì)屬性的賦值。
(3)注意事項(xiàng)
- @ConfigurationProperties 和 @value 有著相同的功能,但是 @ConfigurationProperties的寫(xiě)法更為方便;
- @ConfigurationProperties 的 POJO類(lèi)的命名比較嚴(yán)格,因?yàn)樗仨毢蚿refix的后綴名要一致, 不然值會(huì)綁定不上, 特殊的后綴名是“driver-class-name”這種帶橫杠的情況,在POJO里面的命名規(guī)則是 下劃線轉(zhuǎn)駝峰 就可以綁定成功,所以就是 “driverClassName”。
到此這篇關(guān)于Spring Boot常用注解(經(jīng)典干貨)的文章就介紹到這了,更多相關(guān)Spring Boot常用注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在java中用Scanner類(lèi)讀入單個(gè)字符的方法
今天小編就為大家分享一篇在java中用Scanner類(lèi)讀入單個(gè)字符的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07javaweb如何使用華為云短信通知公共類(lèi)調(diào)用
這篇文章主要介紹了javaweb使用華為云短信通知公共類(lèi)調(diào)用的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06mybatis中Oracle參數(shù)為NULL錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了mybatis中Oracle參數(shù)為NULL錯(cuò)誤問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器
這篇文章主要介紹了 java 實(shí)現(xiàn)微信服務(wù)器下載圖片到自己服務(wù)器的相關(guān)資料,需要的朋友可以參考下2017-05-05SpringBoot中的PUT和Delete請(qǐng)求使用
這篇文章主要介紹了SpringBoot中的PUT和Delete請(qǐng)求使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07深入學(xué)習(xí)Java編程中的字符串的進(jìn)階使用
這篇文章主要介紹了Java編程中的字符串的高級(jí)運(yùn)用,包括StringBuffer類(lèi)和StringTokenizer類(lèi)以及常量池的介紹,需要的朋友可以參考下2016-01-01java實(shí)現(xiàn)將文件上傳到ftp服務(wù)器的方法
這篇文章主要介紹了java實(shí)現(xiàn)將文件上傳到ftp服務(wù)器的方法,結(jié)合實(shí)例形式分析了基于java實(shí)現(xiàn)的ftp文件傳輸類(lèi)定義與使用方法,需要的朋友可以參考下2016-08-08