1 spring注解介紹
Spring Framework是一個(gè)開源的Java平臺(tái),廣泛用于創(chuàng)建高性能的企業(yè)應(yīng)用程序。隨著Spring的發(fā)展,注解(Annotation)已經(jīng)成為了配置Spring應(yīng)用程序的主要方式,逐漸取代了傳統(tǒng)的XML配置。使用注解可以使代碼更加簡(jiǎn)潔明了,提高開發(fā)效率和可讀性。
Spring的注解驅(qū)動(dòng)的編程模型大大簡(jiǎn)化了Java企業(yè)應(yīng)用的開發(fā)。通過減少配置的復(fù)雜性,提高代碼的清晰度和模塊化,Spring注解使得開發(fā)者可以更加專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。隨著Spring框架的不斷演進(jìn),注解的使用變得越來越靈活和強(qiáng)大,為構(gòu)建現(xiàn)代Java應(yīng)用程序提供了強(qiáng)有力的支持。
1.1 核心注解
1.1.1 @SpringBootApplication
這是一個(gè)組合注解,標(biāo)記在應(yīng)用的主類上。它結(jié)合了以下三個(gè)注解的功能:
@Configuration:標(biāo)記一個(gè)類作為bean定義的源。
@EnableAutoConfiguration:?jiǎn)⒂肧pring Boot的自動(dòng)配置機(jī)制。
@ComponentScan:?jiǎn)⒂聾Component注解的掃描。
1.1.2 @Component
這是一個(gè)泛化的注解,用于定義Spring管理的組件。它表明一個(gè)類會(huì)作為組件類,并告訴Spring要為這個(gè)類創(chuàng)建bean。
1.1.3 @Repository
在DAO層(數(shù)據(jù)訪問層)使用,標(biāo)記一個(gè)類作為數(shù)據(jù)訪問對(duì)象。
1.1.4 @Service
在服務(wù)層使用,標(biāo)記一個(gè)類作為服務(wù)類。
1.1.5 @Controller
在表現(xiàn)層使用,標(biāo)記一個(gè)類作為Spring MVC控制器。
1.1.6 @RestController
結(jié)合了@Controller和@ResponseBody的功能,用于創(chuàng)建RESTful Web服務(wù)。
1.1.7 @RequestMapping & @GetMapping/@PostMapping/@PutMapping/@DeleteMapping
這些注解用于處理Web請(qǐng)求。@RequestMapping是一個(gè)通用的請(qǐng)求處理注解,而其他注解是它的特化版本,用于處理HTTP中的GET、POST、PUT和DELETE請(qǐng)求。
1.1.8 @Autowired
用于自動(dòng)注入Spring容器中的bean??梢杂糜谧兞?、方法和構(gòu)造函數(shù)上。
1.1.9 @Qualifier
與@Autowired一起使用,當(dāng)有多個(gè)同類型的bean時(shí),用于指定要注入的bean。
1.1.10 @Bean
在方法上使用,表明這個(gè)方法將返回一個(gè)對(duì)象,該對(duì)象要注冊(cè)為Spring應(yīng)用程序上下文中的bean。
1.2 配置和管理
1.2.1 Java配置類
使用注解配置時(shí),通常會(huì)有一個(gè)或多個(gè)帶有@Configuration注解的Java類,它們定義了應(yīng)用程序上下文中的bean。
1.2.2 依賴注入
@Autowired注解用于實(shí)現(xiàn)依賴注入。Spring容器會(huì)在創(chuàng)建bean時(shí)自動(dòng)注入所需的依賴。
1.2.3 條件化的Bean創(chuàng)建
可以使用@Conditional注解(或其特化形式如@ConditionalOnClass、@ConditionalOnBean)來根據(jù)特定條件創(chuàng)建beans。
1.3 AOP和事務(wù)管理
1.3.1 @Aspect
在類上使用,將其標(biāo)記為切面類。
1.3.2 @Before、@After、@Around
這些注解用于定義通知(Advice),是AOP(面向切面編程)的關(guān)鍵部分。
1.3.3 @Transactional
聲明事務(wù)的范圍和行為。可以用于類或方法級(jí)別。
1.4 測(cè)試支持
1.4.1 @SpringBootTest
用于Spring Boot應(yīng)用程序的集成測(cè)試,可以啟動(dòng)一個(gè)嵌入式的Spring應(yīng)用程序上下文。
1.4.2 @DataJpaTest、@WebMvcTest等
用于更細(xì)粒度的測(cè)試配置,專門測(cè)試JPA倉(cāng)庫(kù)、Spring MVC控制器等。
1.4.3 @MockBean 和 @SpyBean
用于在Spring Boot測(cè)試中添加和配置mock對(duì)象。
1.5 實(shí)用注解
1.5.1 @Value
用于注入屬性文件中的值。
1.5.2 @Profile
指定某個(gè)bean只在特定的配置文件激活時(shí)才創(chuàng)建。
1.5.3 @PropertySource
指定用于填充環(huán)境屬性的屬性文件。
1.5.3 @Scope
定義bean的作用域,如singleton、prototype等。
2 Spring注解詳解
2.1 bean factory注解
@Configuration ? ? ?
把一個(gè)類作為一個(gè)IoC容器,可理解為用xml里的<beans>標(biāo)簽
@ComponentScan
啟用類掃描,與xml中<context:component-scan>作用一致@ComponentScans
@Conditional
根據(jù)滿足某個(gè)特定的條件創(chuàng)建一個(gè)特定的Bean
@Bean ? ? ? ? ? ? ? ? ?
告訴被注釋的方法產(chǎn)生一個(gè)Bean,然后交給Spring容器,用在方法上,告訴Spring容器可以從這個(gè)方法中拿到一個(gè)Bean
@Lazy ? ? ? ? ? ? ? ? ??
用于指定該Bean是否取消預(yù)初始化。主要用于修飾Spring Bean類,用于指定該Bean的預(yù)初始化行為
@DependsOn ? ? ? ??
用于強(qiáng)制初始化其他Bean??梢孕揎桞ean類或方法,使用該Annotation時(shí)可以指定一個(gè)字符串?dāng)?shù)組作為參數(shù),每個(gè)數(shù)組元素對(duì)應(yīng)于一個(gè)強(qiáng)制初始化的Bean
@Import ? ? ? ? ? ? ? ??
支持導(dǎo)入配置類,也支持導(dǎo)入普通的java類,并將其聲明成一個(gè)bean
@ImportResource、@Value
用來進(jìn)行資源文件的讀取
@Primary ? ? ? ? ? ? ??
在眾多相同的bean中,優(yōu)先使用用@Primary注解的bean
@Qualifier ? ? ? ? ? ? ?
指定某個(gè)bean有沒有資格進(jìn)行注入
@Profile ? ? ? ? ? ? ??
標(biāo)注的組件只有當(dāng)指定profile值匹配時(shí)才生效,可以通過以下方式設(shè)置profile值:
(1)設(shè)置spring.profiles.active屬性(通過JVM參數(shù)、環(huán)境變量或者web.xml中的Servlet context參數(shù))
(2)ApplicationContext.getEnvironment().setActiveProfiles(“ProfileName”)根據(jù)實(shí)際環(huán)境設(shè)置profile值,然后被profile標(biāo)注(而且value=設(shè)置值)的bean才會(huì)被注冊(cè)到spring容器
@Scope ? ? ? ? ? ? ??
默認(rèn)是單例模式,即scope="singleton"
singleton單例模式:全局有且僅有一個(gè)實(shí)例
prototype原型模式:每次獲取Bean的時(shí)候會(huì)有一個(gè)新的實(shí)例
request:equest表示該針對(duì)每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,同時(shí)該bean僅在當(dāng)前HTTP request內(nèi)有效
session:session作用域表示該針對(duì)每一次HTTP請(qǐng)求都會(huì)產(chǎn)生一個(gè)新的bean,同時(shí)該bean僅在當(dāng)前
HTTP session內(nèi)有效
global session:作用域類似于標(biāo)準(zhǔn)的HTTP Session作用域,僅僅在基于portlet的web應(yīng)用中才有意義。
@PropertySource ? ? ? ?
讀取properties文件
@Autowired ? ? ? ? ??
它可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。 通過 @Autowired的使用來消除set ,get方法
@Required ? ? ? ? ? ? ??
適用于bean屬性的setter方法并且它指示,受影響的bean屬性必須在配置時(shí)被填充在XML配置文件中,否則容器將拋出BeanInitializationException例外
@Order ? ? ? ? ? ? ? ? ?
在spring 4.0之前,@Order標(biāo)記只支持AspectJ的切面排序。spring 4.0對(duì)@Order做了增強(qiáng),它開始支持對(duì)裝載在諸如Lists和Arrays容器中的自動(dòng)包裝(auto-wired)組件的排序
@AliasFor ? ? ? ? ? ? ??
給注解的屬性起別名,讓使用注解時(shí),更加的容易理解
@Component ? ? ? ? ?
這是一個(gè)元注解,意思是它可以用于標(biāo)注其他注解,被它標(biāo)注的注解和它起到相同或者類似的作用
2.2 Spring mvc注解
@Controller ? ? ? ? ? ?
用于標(biāo)注控制層組件
@Service ? ? ? ? ? ? ? ?
用于標(biāo)注業(yè)務(wù)層組件
@Respository ? ? ? ? ?
用于標(biāo)注數(shù)據(jù)層組件DAO
@ControllerAdvice ? ?
通過@ControllerAdvice。我們可以將對(duì)于控制器的全局配置放置在同一個(gè)位置,注解
了@ControllerAdvice的類的方法可以使用@ExceptionHandler,@InitBinder,@ModelAttribute注解到方法上,這對(duì)所有注解了@RequestMapping的控制器內(nèi)的方法有效。
@ExceptionHandler:
用于全局處理控制器里面的異常。
@InitBinder:
用來設(shè)置WebDataBinder,WebDataBinder用來自動(dòng)綁定前臺(tái)請(qǐng)求參數(shù)到Model中。
@ModelAttribute
本來的作用是綁定鍵值對(duì)到Model里,此處是讓全局的@RequestMapping都能獲得在此處設(shè)置的鍵值對(duì)。
@InitBinder ? ? ? ? ? ??
用于在@Controller中標(biāo)注于方法,表示為當(dāng)前控制器注冊(cè)一個(gè)屬性編輯器或者其他,只對(duì)當(dāng)前的Controller有效
@ModelAttribute ? ? ??
兩種應(yīng)用場(chǎng)景:運(yùn)用在參數(shù)上,會(huì)將客戶端傳遞過來的參數(shù)按名稱注入到指定對(duì)象中,并且會(huì)將這個(gè)對(duì)象自動(dòng)加入ModelMap中,便于View層使用;運(yùn)用在方法上,會(huì)在每一個(gè)@RequestMapping標(biāo)注的方法前執(zhí)行,如果有返回值,則自動(dòng)將該返回值加入到ModelMap中;
@MatrixVariable ? ? ??
在傳遞path相關(guān)的參數(shù)是使用,利用MatrixVariable可以動(dòng)態(tài)傳遞參照的元素id
@RequestMapping ? ?
用來處理請(qǐng)求地址映射,可用于類或方法上。用于類上,表示類中的所有響應(yīng)請(qǐng)求的方法都是以該地址作為父路徑
@RequestParam ? ? ??
用來處理請(qǐng)求參數(shù)映射 @RequestPart 用來處理文件上傳 @RequestBody 對(duì)應(yīng)的POST請(qǐng)求的body,body即是獲取的參數(shù),如果想通過參數(shù)去獲取,則要使用@RequestParams
@RequestHeader ? ? ?
用于映射控制器參數(shù)以請(qǐng)求頭值的注釋
@RequestAttribute ? ?
用于訪問由過濾器或攔截器創(chuàng)建的、預(yù)先存在的請(qǐng)求屬性
@SessionAttribute ? ??
用于訪問預(yù)先存在的全局會(huì)話屬性 @CookieValue用來獲取Cookie中的值
@ExceptionHandler ??
對(duì)web的服務(wù)器端運(yùn)行錯(cuò)誤, 做統(tǒng)一的處理
@CrossOrigin ? ? ? ? ??
跨域注解
@GetMapping ? ? ? ? ?
簡(jiǎn)化常用的HTTP方法的映射,是@RequestMapping(method = RequestMethod.GET)的縮寫
@PostMapping ? ? ? ??
組合注解,簡(jiǎn)化常用的HTTP方法的映射
@PutMapping ? ? ? ? ??
組合注解,簡(jiǎn)化常用的HTTP方法的映射
@DeleteMapping ? ? ??
組合注解,簡(jiǎn)化常用的HTTP方法的映射
@PatchMapping ? ? ? ?
組合注解,簡(jiǎn)化常用的HTTP方法的映射
@RestController ? ? ? ?
標(biāo)識(shí)類作為控制器,每一個(gè)方法返回域?qū)ο髉ojo代替一個(gè)視圖
@RestControllerAdvice
一個(gè)組件注解,異常統(tǒng)一處理
@ResponseBody ? ? ??
內(nèi)容或?qū)ο笞鳛?HTTP 響應(yīng)正文返回,并調(diào)用適合HttpMessageConverter的Adapter轉(zhuǎn)換對(duì)象,寫入輸出流@ResponseStatus ? ? ? 用于修飾一個(gè)類或者一個(gè)方法,修飾一個(gè)類的時(shí)候,一般修飾的是一個(gè)異常類@PathVariable 可以將 URL 中占位符參數(shù)綁定到控制器處理方法的入?yún)⒅?/p>
@Validated ? ? ? ? ? ? ? ?
是@Valid 的一次封裝,是Spring提供的校驗(yàn)機(jī)制使用
@EnableWebMvc ? ? ? ? ??
啟用spring mvc
JSR-250
@PostConstruct ? ? ? ? ?
注解的方法將會(huì)在依賴注入完成后被自動(dòng)調(diào)用,順序Constructor >> @Autowired >> @PostConstruct
@PreDestroy ? ? ? ? ? ? ??
銷毀之前調(diào)用方法@Resource 注解被用來激活一個(gè)命名資源(named resource)的依賴注入
JSR-330
@Inject ? ? ? ? ? ? ? ? ? ? ?
可以注入對(duì)象,在屬性域上面注入、在set方法或者其他需要注入的方法上面注入、在構(gòu)造器上面注入@Inject沒有@required標(biāo)簽,強(qiáng)制要求對(duì)象不能為空
@Named ? ? ? ? ? ? ? ? ? ?
可以有值,如果沒有值生成的Bean名稱默認(rèn)和類名相同
? ? ?
@Max ? ?
校驗(yàn)最大值
@Min ? ? ? ? ? ? ? ?
校驗(yàn)最小值
@NotNull ? ? ? ? ? ? ? ? ? ?
校驗(yàn)不能為空
@Size ? ? ? ? ? ? ? ? ? ? ? ??
校驗(yàn)長(zhǎng)度
@Pattern ? ? ? ? ? ? ? ? ? ??
正則校驗(yàn)
@Valid ? ? ? ? ? ? ? ? ? ? ? ?
標(biāo)識(shí)校驗(yàn)bean,要緊挨著JavaBean,要不然不會(huì)生效的
2.3 數(shù)據(jù)處理層注解
@EnableTransactionManagement ? ? ? ? ? ?
激活事務(wù)管理@Transactional 可以作用于接口、接口方法、類以及類方法上。當(dāng)作用于類
上時(shí),該類的所有 public 方法將都具有該類型的事務(wù)屬性,同時(shí),我們也可以在方法級(jí)別
使用該標(biāo)注來覆蓋類級(jí)別的定義
@EnableAspectJAutoProxy ? ? ? ? ? ? ? ? ? ? ?
激活A(yù)spect自動(dòng)代理
@EnableCaching ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
激活數(shù)據(jù)緩存
@CacheConfig ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
在類級(jí)別上統(tǒng)一定義緩存名稱
@Cacheable ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
主要針對(duì)方法配置,能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其結(jié)果進(jìn)行緩存
@Caching ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
對(duì)于@Caching注解來講,如果有兩種不同的需求,都是放在同一個(gè)方法上,這種需求如果
只是使用@CacheEvict或者@CachePut是無法實(shí)現(xiàn),因?yàn)樗麄儾荒芏鄻踊淖饔迷谕粋€(gè)
方法上??梢允褂聾Caching(evict={@CacheEvict(“a1”),@CacheEvict(“a2”,allEntries=true)})
@CachePut ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
主要針對(duì)方法配置,能夠根據(jù)方法的請(qǐng)求傳輸對(duì)其結(jié)果進(jìn)行緩存,和@Cacheable不同的
是,它每次都會(huì)觸發(fā)真實(shí)的方法調(diào)用
@CacheEvict ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
主要針對(duì)方法配置,能夠根據(jù)一定的條件對(duì)緩存進(jìn)行清空
Bean Validation 中內(nèi)置的 constraint
@Null ? ? ? ? ? ? ? ? ? ? ? ? ? 被注釋的元素必須為 null ? ?
@NotNull ? ? ? ? ? ? ? ? ? ? ?被注釋的元素必須不為 null ? ??
@AssertTrue ? ? ? ? ? ? ? ? 被注釋的元素必須為 true ? ?
@AssertFalse ? ? ? ? ? ? ? ?被注釋的元素必須為 false ? ??
@Min(value) ? ? ? ? ? ? ? ? ?被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值 ? ?
@Max(value) ? ? ? ? ? ? ? ? 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值 ? ??
@DecimalMin(value) ? ? ? 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值 ? ?
@DecimalMax(value) ? ? ?被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值 ? ??
@Size(max=, min=) ? ? ? ?被注釋的元素的大小必須在指定的范圍內(nèi) ? ?
@Digits (integer, fraction) ? ?被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi) ? ??
@Past ? ? ? ? ? ? ? ? ? ? ? ? ?被注釋的元素必須是一個(gè)過去的日期 ? ?
@Future ? ? ? ? ? ? ? ? ? ? ? 被注釋的元素必須是一個(gè)將來的日期 ? ??
@Pattern(regex=,flag=) ? 被注釋的元素必須符合指定的正則表達(dá)式 ? ?
Hibernate Validator 附加的 constraint ? ??
@NotBlank(message =) ? ?驗(yàn)證字符串非null,且長(zhǎng)度必須大于0 ? ?
@Email ? ? ? ? ? ? ? ? ? ? ? ? ?被注釋的元素必須是電子郵箱地址 ? ??
@Length(min=,max=) ? ? ? 被注釋的字符串的大小必須在指定的范圍內(nèi) ? ?
@NotEmpty ? ? ? ? ? ? ? ? ? ?被注釋的字符串的必須非空 ? ??
@Range(min=,max=,message=) ? 被注釋的元素必須在合適的范圍內(nèi)
MyBatis
@Param 映射參數(shù)注解@Select 查詢注解@Update 更新注解@Delete 刪除注解@Insert 插入注解@Results 結(jié)果注解@Result 結(jié)果注解@Options 選項(xiàng)注解文章來源:http://www.zghlxwxcb.cn/news/detail-831151.html
2.4 切面注解@Aspect 聲明一個(gè)切面
@After ? ? ? ? ? ? ? ? ? ? ? ? 注解切入時(shí)機(jī)為執(zhí)行完成
@AfterReturning ? ? ? ? ? ? ? ?注解切入時(shí)機(jī)為執(zhí)行返回
@AfterThrowing ? ? ? ? ? ? ? ? 注解切入時(shí)機(jī)為拋出異常
@Around ? ? ? ? ? ? ? ? ? ? ? ?注解切入時(shí)機(jī)為環(huán)繞
@Before ? ? ? ? ? ? ? ? ? ? ? ?注解切入時(shí)機(jī)為開始調(diào)用
@DeclareParents ? ? ? ? ? ? ? ?注解引入新的方法
@Pointcut ? ? ? ? ? ? ? ? ? ? ?定義切點(diǎn)
2.5 任務(wù)處理注解
@EnableAsync ? ? ? ? ? ? ? ? ? 開啟多線程,可以標(biāo)注在方法、類上
@Async ? ? ? ? ? ? ? ? ? ? ? ? 異步方法;這些方法將在執(zhí)行的時(shí)候,將會(huì)在獨(dú)立的線程中被執(zhí)行,調(diào)用者無需等待它的完成,即可繼續(xù)其他的操作
@EnableScheduling ? ? ? ? ? ? ?開啟對(duì)計(jì)劃任務(wù)的支持,然后在要執(zhí)行計(jì)劃任務(wù)的方法上注解@Scheduled,聲明這是一個(gè)計(jì)劃任務(wù)
@Scheduled ? ? ? ? ? ? ? ? ? ? 聲明這是一個(gè)計(jì)劃任務(wù)
@Schedules
?文章來源地址http://www.zghlxwxcb.cn/news/detail-831151.html
到了這里,關(guān)于Spring中常見的注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!