0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot常用注解及原理

jf_78858299 ? 來源:GitHub ? 作者:GitHub樂樂 ? 2023-04-07 14:30 ? 次閱讀

一、啟動注解 @SpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
    // ... 此處省略源碼
}

查看源碼可發(fā)現(xiàn),@SpringBootApplication是一個(gè)復(fù)合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan這三個(gè)注解

@SpringBootConfiguration 注解,繼承@Configuration注解,主

要用于加載配置文件

@SpringBootConfiguration繼承自@Configuration,二者功能也一致,標(biāo)注當(dāng)前類是配置類, 并會將當(dāng)前類內(nèi)聲明的一個(gè)或多個(gè)以@Bean注解標(biāo)記的方法的實(shí)例納入到spring容器中,并且實(shí)例名就是方法名。

@EnableAutoConfiguration 注解,開啟自動配置功能

@EnableAutoConfiguration可以幫助SpringBoot應(yīng)用將所有符合條件的@Configuration配置都加載到當(dāng)前SpringBoot創(chuàng)建并使用的IoC容器。借助于Spring框架原有的一個(gè)工具類:SpringFactoriesLoader的支持,@EnableAutoConfiguration可以智能的自動配置功效才得以大功告成

@ComponentScan 注解,主要用于組件掃描和自動裝配

@ComponentScan的功能其實(shí)就是自動掃描并加載符合條件的組件或bean定義,最終將這些bean定義加載到容器中。我們可以通過basePackages等屬性指定@ComponentScan自動掃描的范圍,如果不指定,則默認(rèn)Spring框架實(shí)現(xiàn)從聲明@ComponentScan所在類的package進(jìn)行掃描,默認(rèn)情況下是不指定的,所以SpringBoot的啟動類最好放在root package下。

二、Controller 相關(guān)注解

@Controller

控制器,處理http請求。

@RestController 復(fù)合注解

查看@RestController源碼

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     * @since 4.0.1
     */
    @AliasFor(annotation = Controller.class)
    String value() default "";
}

從源碼我們知道,@RestController注解相當(dāng)于@ResponseBody+@Controller合在一起的作用,RestController使用的效果是將方法返回的對象直接在瀏覽器上展示成json格式.

@RequestBody

通過HttpMessageConverter讀取Request Body并反序列化為Object(泛指)對象

@RequestMapping

@RequestMapping 是 Spring Web 應(yīng)用程序中最常被用到的注解之一。

這個(gè)注解會將 HTTP 請求映射到 MVC 和 REST 控制器的處理方法上

@GetMapping用于將HTTP get請求映射到特定處理程序的方法注解

注解簡寫:@RequestMapping(value = "/say",method = RequestMethod.GET)等價(jià)于:@GetMapping(value = "/say")

GetMapping源碼

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
//...
}

是@RequestMapping(method = RequestMethod.GET)的縮寫

@PostMapping用于將HTTP post請求映射到特定處理程序的方法注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {
    //...
}

是@RequestMapping(method = RequestMethod.POST)的縮寫

三、取請求參數(shù)

@PathVariable:獲取url中的數(shù)據(jù)

@Controller
@RequestMapping("/User")
public class HelloWorldController {

    @RequestMapping("/getUser/{uid}")
    public String getUser(@PathVariable("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}

請求示例:http://localhost:8080/User/getUser/123

@RequestParam:獲取請求參數(shù)的值

@Controller
@RequestMapping("/User")
public class HelloWorldController {

    @RequestMapping("/getUser")
    public String getUser(@RequestParam("uid")Integer id, Model model) {
        System.out.println("id:"+id);
        return "user";
    }
}

請求示例:http://localhost:8080/User/getUser?uid=123

@RequestHeader 把Request請求header部分的值綁定到方法的參數(shù)上

@CookieValue 把Request header中關(guān)于cookie的值綁定到方法的參數(shù)上

四、注入bean相關(guān)

@Repository

DAO層注解,DAO層中接口繼承JpaRepository,需要在build.gradle中引入相關(guān)jpa的一個(gè)jar自動加載。

Repository注解源碼

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";

}

@Service

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Service {

    /**
     * The value may indicate a suggestion for a logical component name,
     * to be turned into a Spring bean in case of an autodetected component.
     * @return the suggested component name, if any (or empty String otherwise)
     */
    @AliasFor(annotation = Component.class)
    String value() default "";
}
  • @Service是@Component注解的一個(gè)特例,作用在類上
  • @Service注解作用域默認(rèn)為單例
  • 使用注解配置和類路徑掃描時(shí),被@Service注解標(biāo)注的類會被Spring掃描并注冊為Bean
  • @Service用于標(biāo)注服務(wù)層組件,表示定義一個(gè)bean
  • @Service使用時(shí)沒有傳參數(shù),Bean名稱默認(rèn)為當(dāng)前類的類名,首字母小寫
  • @Service(“serviceBeanId”)或@Service(value=”serviceBeanId”)使用時(shí)傳參數(shù),使用value作為Bean名字

@Scope作用域注解

@Scope作用在類上和方法上,用來配置 spring bean 的作用域,它標(biāo)識 bean 的作用域

@Scope源碼

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {

    /**
     * Alias for {@link #scopeName}.
     * @see #scopeName
     */
    @AliasFor("scopeName")
    String value() default "";

    @AliasFor("value")
    String scopeName() default "";

    ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}

屬性介紹

value
    singleton   表示該bean是單例的。(默認(rèn))
    prototype   表示該bean是多例的,即每次使用該bean時(shí)都會新建一個(gè)對象。
    request     在一次http請求中,一個(gè)bean對應(yīng)一個(gè)實(shí)例。
    session     在一個(gè)httpSession中,一個(gè)bean對應(yīng)一個(gè)實(shí)例。

proxyMode
    DEFAULT         不使用代理。(默認(rèn))
    NO              不使用代理,等價(jià)于DEFAULT。
    INTERFACES      使用基于接口的代理(jdk dynamic proxy)。
    TARGET_CLASS    使用基于類的代理(cglib)。

@Entity實(shí)體類注解

@Table(name ="數(shù)據(jù)庫表名"),這個(gè)注解也注釋在實(shí)體類上,對應(yīng)數(shù)據(jù)庫中相應(yīng)的表。

@Id、@Column注解用于標(biāo)注實(shí)體類中的字段,pk字段標(biāo)注為@Id,其余@Column。

@Bean產(chǎn)生一個(gè)bean的方法

@Bean明確地指示了一種方法,產(chǎn)生一個(gè)bean的方法,并且交給Spring容器管理。支持別名@Bean("xx-name")

@Autowired 自動導(dǎo)入

  • @Autowired注解作用在構(gòu)造函數(shù)、方法、方法參數(shù)、類字段以及注解上
  • @Autowired注解可以實(shí)現(xiàn)Bean的自動注入

@Component

把普通pojo實(shí)例化到spring容器中,相當(dāng)于配置文件中的

雖然有了@Autowired,但是我們還是要寫一堆bean的配置文件,相當(dāng)麻煩,而@Component就是告訴spring,我是pojo類,把我注冊到容器中吧,spring會自動提取相關(guān)信息。那么我們就不用寫麻煩的xml配置文件了

五、導(dǎo)入配置文件

@PropertySource注解

引入單個(gè)properties文件:

@PropertySource(value = {"classpath : xxxx/xxx.properties"})

引入多個(gè)properties文件:

@PropertySource(value = {"classpath : xxxx/xxx.properties","classpath : xxxx.properties"})

@ImportResource導(dǎo)入xml配置文件

可以額外分為兩種模式 相對路徑classpath,絕對路徑(真實(shí)路徑)file

注意:單文件可以不寫value或locations,value和locations都可用

相對路徑(classpath)

  • 引入單個(gè)xml配置文件:@ImportSource("classpath : xxx/xxxx.xml")
  • 引入多個(gè)xml配置文件:@ImportSource(locations={"classpath : xxxx.xml" , "classpath : yyyy.xml"})

絕對路徑(file)

  • 引入單個(gè)xml配置文件:@ImportSource(locations= {"file : d:/hellxz/dubbo.xml"})
  • 引入多個(gè)xml配置文件:@ImportSource(locations= {"file : d:/hellxz/application.xml" , "file : d:/hellxz/dubbo.xml"})
    取值:使用@Value注解取配置文件中的值
@Value("${properties中的鍵}")
private String xxx;

@Import 導(dǎo)入額外的配置信息

功能類似XML配置的,用來導(dǎo)入配置類,可以導(dǎo)入帶有@Configuration注解的配置類或?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ù)管理使用TransactionTemplate或者直接使用底層的PlatformTransactionManager。對于編程式事務(wù)管理,spring推薦使用TransactionTemplate。

聲明式事務(wù)管理:建立在AOP之上的。其本質(zhì)是對方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個(gè)事務(wù),在執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行情況提交或者回滾事務(wù),通過@Transactional就可以進(jìn)行事務(wù)操作,更快捷而且簡單。推薦使用

七、全局異常處理

@ControllerAdvice 統(tǒng)一處理異常

@ControllerAdvice 注解定義全局異常處理類

@ControllerAdvice
public class GlobalExceptionHandler {
}

@ExceptionHandler 注解聲明異常處理方法

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    @ResponseBody
    String handleException(){
        return "Exception Deal!";
    }
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2952

    瀏覽量

    104479
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    492

    瀏覽量

    22027
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    338

    瀏覽量

    14295
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    149

    瀏覽量

    35751
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    161
收藏 人收藏

    評論

    相關(guān)推薦

    Springboot是如何獲取自定義異常并進(jìn)行返回的

    源碼剖析Springboot是如何獲取自定義異常并進(jìn)行返回的。來吧!第一步:肯定是在Springboot啟動的過程中進(jìn)行的異常處理初始化,于是就找到了handlerExceptionResolver類
    發(fā)表于 03-22 14:15

    Spring Boot的注解原理是什么

    首先,先看SpringBoot的主配置類: @SpringBootApplicationpublic class StartEurekaApplication { public static
    的頭像 發(fā)表于 08-27 09:24 ?2155次閱讀

    Spring Boot中常見的各類型注解的使用方式

    大家好,我是程序汪,企業(yè)開發(fā)項(xiàng)目SpringBoot已經(jīng)是必備框架了,其中注解是開發(fā)中的小工具(誰處可見哦),用好了開發(fā)效率大大提升,當(dāng)然用錯了也會引入缺陷。
    的頭像 發(fā)表于 06-20 16:38 ?1731次閱讀

    Spring Boot常用注解與使用方式

    企業(yè)開發(fā)項(xiàng)目SpringBoot已經(jīng)是必備框架了,其中注解是開發(fā)中的小工具(誰處可見哦),用好了開發(fā)效率大大提升,當(dāng)然用錯了也會引入缺陷。
    的頭像 發(fā)表于 07-08 10:57 ?1327次閱讀

    求一種SpringBoot定時(shí)任務(wù)動態(tài)管理通用解決方案

    SpringBoot的定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對SpringBoot原生的定時(shí)任務(wù)進(jìn)行動態(tài)管理,完全兼容原生@Scheduled注解,無需對原本的定時(shí)任務(wù)進(jìn)行修改
    的頭像 發(fā)表于 02-03 09:49 ?743次閱讀

    什么是 SpringBoot?

    本文從為什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里開始入手,逐步分析了 `SpringBoot` 自動裝配的原理,最后手寫了一個(gè)簡單的 `start` 組件,通過實(shí)戰(zhàn)來體會了 `
    的頭像 發(fā)表于 04-07 11:28 ?1254次閱讀
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot常用注解及使用方法1

    基于 SpringBoot 平臺開發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于`Spring`開發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開發(fā),而且非常簡單,基本可以做到開箱即用! 那
    的頭像 發(fā)表于 04-07 11:51 ?666次閱讀

    SpringBoot常用注解及使用方法2

    基于 SpringBoot 平臺開發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于Spring開發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開發(fā),而且非常簡單,基本可以做到開箱即用!
    的頭像 發(fā)表于 04-07 11:52 ?628次閱讀

    Springboot常用注解合集

    前幾章,在系統(tǒng)啟動類里面,都加入了此啟動注解,此注解是個(gè)組合注解,包括了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`
    的頭像 發(fā)表于 04-07 14:27 ?698次閱讀
    <b class='flag-5'>Springboot</b><b class='flag-5'>常用</b><b class='flag-5'>注解</b>合集

    SpringBoot的核心注解1

    今天跟大家來探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?659次閱讀
    <b class='flag-5'>SpringBoot</b>的核心<b class='flag-5'>注解</b>1

    SpringBoot的核心注解2

    今天跟大家來探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?1916次閱讀
    <b class='flag-5'>SpringBoot</b>的核心<b class='flag-5'>注解</b>2

    springmvc常用5種注解

    SpringMVC是一種基于Java的Web框架,使用注解可以更加方便靈活地開發(fā)和管理控制器,實(shí)現(xiàn)請求的映射和處理。在SpringMVC中,有許多常用注解,本文將詳細(xì)介紹其中的五種注解
    的頭像 發(fā)表于 11-22 16:51 ?766次閱讀

    springboot核心注解

    Spring Boot 是基于 Spring 框架的開源框架,它可以幫助開發(fā)者快速構(gòu)建、部署和運(yùn)行獨(dú)立的、生產(chǎn)級的 Spring 應(yīng)用程序。Spring Boot 提供了一系列核心注解,這些注解可以
    的頭像 發(fā)表于 11-23 09:23 ?481次閱讀

    一個(gè)注解搞定SpringBoot接口防刷

    技術(shù)要點(diǎn):springboot的基本知識,redis基本操作,
    的頭像 發(fā)表于 11-28 10:46 ?380次閱讀

    SpringBoot核心注解由幾個(gè)注解組成

    簡化應(yīng)用程序開發(fā)的注解,其中核心注解包括 @SpringBootApplication、@RestController、@RequestMapping、@Autowired、@ComponentScan
    的頭像 發(fā)表于 12-03 15:09 ?685次閱讀