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

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

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

SpringBoot常用注解及使用方法2

jf_78858299 ? 來(lái)源:Java極客技術(shù) ? 作者:鴨血粉絲Tang ? 2023-04-07 11:52 ? 次閱讀

2.3、JPA 相關(guān)注解

  • @Entity@Table

表明這是一個(gè)實(shí)體類(lèi),這兩個(gè)注解一般一塊使用,但是如果表名和實(shí)體類(lèi)名相同的話,@Table可以省略。

  • @Id

表示該屬性字段對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的主鍵字段。

  • @Column

表示該屬性字段對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中的列名,如果字段名與列名相同,則可以省略。

  • @GeneratedValue

表示主鍵的生成策略,有四個(gè)選項(xiàng),分別如下:

  • AUTO:表示由程序控制,是默認(rèn)選項(xiàng) ,不設(shè)置就是這個(gè)
  • IDENTITY:表示由數(shù)據(jù)庫(kù)生成,采用數(shù)據(jù)庫(kù)自增長(zhǎng),Oracle 不支持這種方式
  • SEQUENCE:表示通過(guò)數(shù)據(jù)庫(kù)的序列生成主鍵ID,MYSQL 不支持
  • Table:表示由特定的數(shù)據(jù)庫(kù)產(chǎn)生主鍵,該方式有利于數(shù)據(jù)庫(kù)的移植
  • @SequenceGeneretor

用來(lái)定義一個(gè)生成主鍵的序列,它需要與@GeneratedValue聯(lián)合使用才有效,以TB_ROLE表為例,對(duì)應(yīng)的注解配置如下:

@Entity
@Table(name = "TB_ROLE")
@SequenceGenerator(name = "id_seq", sequenceName = "seq_repair",allocationSize = 1)
public class Role implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主鍵ID,采用【id_seq】序列函數(shù)自增長(zhǎng)
     */
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "id_seq")
    private Long id;


    /* 角色名稱(chēng)
     */
    @Column(nullable = false)
    private String roleName;

    /**
     * 角色類(lèi)型
     */
    @Column(nullable = false)
    private String roleType;
}
  • @Transient

表示該屬性并非與數(shù)據(jù)庫(kù)表的字段進(jìn)行映射,ORM 框架會(huì)將忽略該屬性。

/**
 * 忽略該屬性
 */
@Column(nullable = false)
@Transient
private String lastTime;
  • @Basic(fetch=FetchType.LAZY)

用在某些屬性上,可以實(shí)現(xiàn)懶加載的效果,也就是當(dāng)用到這個(gè)字段的時(shí)候,才會(huì)裝載這個(gè)屬性,如果配置成fetch=FetchType.EAGER,表示即時(shí)加載,也是默認(rèn)的加載方式!

/**
 * 延遲加載該屬性
 */
@Column(nullable = false)
@Basic(fetch = FetchType.LAZY)
private String roleType;
  • @JoinColumn

用于標(biāo)注表與表之間關(guān)系的字段,通常與@OneToOne、@OneToMany搭配使用,例如如下

@Entity
@Table(name = "tb_login_log")
public class LoginLog implements Serializable {
 
 /**
  * 查詢登錄的用戶信息
  */
 @OneToOne
    @JoinColumn(name = "user_id")
    private User user;
 
 //...get、set
}
  • @OneToOne、@OneToMany@ManyToOne

這三個(gè)注解,相當(dāng)于hibernate配置文件中的一對(duì)一,一對(duì)多,多對(duì)一配置,比如下面的客戶地址表,通過(guò)客戶 ID,實(shí)現(xiàn)客戶信息的查詢。

@Entity
@Table(name="address")
public class AddressEO implements java.io.Serializable {
 
  @ManyToOne(cascade = { CascadeType.ALL })
  @JoinColumn(name="customer_id")
  private CustomerEO customer;
 
  //...get、set
}

2.4、配置相關(guān)注解

  • @Configuration

表示聲明一個(gè) Java 形式的配置類(lèi),Spring Boot 提倡基于 Java 的配置,相當(dāng)于你之前在 xml 中配置 bean,比如聲明一個(gè)配置類(lèi)AppConfig,然后初始化一個(gè)Uploader對(duì)象。

@Configuration
public class AppConfig {

    @Bean
    public Uploader initOSSUploader() {
        return new OSSUploader();
    }

}
  • @EnableAutoConfiguration

@EnableAutoConfiguration可以幫助SpringBoot應(yīng)用將所有符合條件的@Configuration配置類(lèi),全部都加載到當(dāng)前SpringBoot里,并創(chuàng)建對(duì)應(yīng)配置類(lèi)的Bean,并把該Bean實(shí)體交給IoC容器進(jìn)行管理。

某些場(chǎng)景下,如果我們想要避開(kāi)某些配置類(lèi)的掃描(包括避開(kāi)一些第三方jar包下面的配置,可以這樣處理。

@Configuration
@EnableAutoConfiguration(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
public class AppConfig {

 //具有業(yè)務(wù)方法
}
  • @ComponentScan

標(biāo)注哪些路徑下的類(lèi)需要被Spring掃描,用于自動(dòng)發(fā)現(xiàn)和裝配一些Bean對(duì)象,默認(rèn)配置是掃描當(dāng)前文件夾下和子目錄下的所有類(lèi),如果我們想指定掃描某些包路徑,可以這樣處理。

@ComponentScan(basePackages = {"com.xxx.a", "com.xxx.b", "com.xxx.c"})
  • @SpringBootApplication

等價(jià)于使用@Configuration、@EnableAutoConfiguration@ComponentScan這三個(gè)注解,通常用于全局啟動(dòng)類(lèi)上,示例如下:

@SpringBootApplication
public class PropertyApplication {

    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}

@SpringBootApplication換成@Configuration、@EnableAutoConfiguration@ComponentScan這三個(gè)注解,一樣可以啟動(dòng)成功,@SpringBootApplication只是將這三個(gè)注解進(jìn)行了簡(jiǎn)化!

  • @EnableTransactionManagement

表示開(kāi)啟事務(wù)支持,等同于 xml 配置方式的

@SpringBootApplication
@EnableTransactionManagement`
public class PropertyApplication {

    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}
  • @Conditional

從 Spring4 開(kāi)始,可以通過(guò)@Conditional注解實(shí)現(xiàn)按條件裝載bean對(duì)象,目前 Spring Boot 源碼中大量擴(kuò)展了@Condition注解,用于實(shí)現(xiàn)智能的自動(dòng)化配置,滿足各種使用場(chǎng)景。下面我給大家列舉幾個(gè)常用的注解:

  • @ConditionalOnBean:當(dāng)某個(gè)特定的Bean存在時(shí),配置生效
  • @ConditionalOnMissingBean:當(dāng)某個(gè)特定的Bean不存在時(shí),配置生效
  • @ConditionalOnClass:當(dāng)Classpath里存在指定的類(lèi),配置生效
  • @ConditionalOnMissingClass:當(dāng)Classpath里不存在指定的類(lèi),配置生效
  • @ConditionalOnExpression:當(dāng)給定的SpEL表達(dá)式計(jì)算結(jié)果為true,配置生效
  • @ConditionalOnProperty:當(dāng)指定的配置屬性有一個(gè)明確的值并匹配,配置生效

具體的應(yīng)用案例如下:

@Configuration
public class ConditionalConfig {


    /**
     * 當(dāng)AppConfig對(duì)象存在時(shí),創(chuàng)建一個(gè)A對(duì)象
     * @return
     */
    @ConditionalOnBean(AppConfig.class)
    @Bean
    public A createA(){
        return new A();
    }

    /**
     * 當(dāng)AppConfig對(duì)象不存在時(shí),創(chuàng)建一個(gè)B對(duì)象
     * @return
     */
    @ConditionalOnMissingBean(AppConfig.class)
    @Bean
    public B createB(){
        return new B();
    }


    /**
     * 當(dāng)KafkaTemplate類(lèi)存在時(shí),創(chuàng)建一個(gè)C對(duì)象
     * @return
     */
    @ConditionalOnClass(KafkaTemplate.class)
    @Bean
    public C createC(){
        return new C();
    }

    /**
     * 當(dāng)KafkaTemplate類(lèi)不存在時(shí),創(chuàng)建一個(gè)D對(duì)象
     * @return
     */
    @ConditionalOnMissingClass(KafkaTemplate.class)
    @Bean
    public D createD(){
        return new D();
    }


    /**
     * 當(dāng)enableConfig的配置為true,創(chuàng)建一個(gè)E對(duì)象
     * @return
     */
    @ConditionalOnExpression("${enableConfig:false}")
    @Bean
    public E createE(){
        return new E();
    }


    /**
     * 當(dāng)filter.loginFilter的配置為true,創(chuàng)建一個(gè)F對(duì)象
     * @return
     */
    @ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true")
    @Bean
    public F createF(){
        return new F();
    }
}
  • @value

可以在任意 Spring 管理的 Bean 中通過(guò)這個(gè)注解獲取任何來(lái)源配置的屬性值,比如你在application.properties文件里,定義了一個(gè)參數(shù)變量!

config.name=zhangsan

在任意的bean容器里面,可以通過(guò)@Value注解注入?yún)?shù),獲取參數(shù)變量值。

@RestController
public class HelloController {

    @Value("${config.name}")
    private String config;

    @GetMapping("config")
    public String config(){
        return JSON.toJSONString(config);
    }
}
  • @ConfigurationProperties

上面@Value在每個(gè)類(lèi)中獲取屬性配置值的做法,其實(shí)是不推薦的。

一般在企業(yè)項(xiàng)目開(kāi)發(fā)中,不會(huì)使用那么雜亂無(wú)章的寫(xiě)法而且維護(hù)也麻煩,通常會(huì)一次性讀取一個(gè) Java 配置類(lèi),然后在需要使用的地方直接引用這個(gè)類(lèi)就可以多次訪問(wèn)了,方便維護(hù),示例如下:

首先,在application.properties文件里定義好參數(shù)變量。

config.name=demo_1
config.value=demo_value_1

然后,創(chuàng)建一個(gè) Java 配置類(lèi),將參數(shù)變量注入即可!

@Component
@ConfigurationProperties(prefix = "config")
public class Config {

    public String name;

    public String value;

    //...get、set
}

最后,在需要使用的地方,通過(guò)ioc注入Config對(duì)象即可!

  • @PropertySource

這個(gè)注解是用來(lái)讀取我們自定義的配置文件的,比如導(dǎo)入test.propertiesbussiness.properties兩個(gè)配置文件,用法如下:

@SpringBootApplication
@PropertySource(value = {"test.properties","bussiness.properties"})
public class PropertyApplication {

    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}
  • @ImportResource

用來(lái)加載 xml 配置文件,比如導(dǎo)入自定義的aaa.xml文件,用法如下:

@ImportResource(locations = "classpath:aaa.xml")
@SpringBootApplication
public class PropertyApplication {

    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}

2.5、異常處理相關(guān)注解

  • @ControllerAdvice@ExceptionHandler

通常組合使用,用于處理全局異常,示例代碼如下:

@ControllerAdvice
@Configuration
@Slf4j
public class GlobalExceptionConfig {
 
 private static final Integer GLOBAL_ERROR_CODE = 500;
 
 @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public void exceptionHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
        log.error("【統(tǒng)一異常處理器】", e);
        ResultMsg resultMsg = new ResultMsg<>();
        resultMsg.setCode(GLOBAL_ERROR_CODE);
        if (e instanceof CommonException) {
           CommonException ex = (CommonException) e;
           if(ex.getErrCode() != 0) {
                resultMsg.setCode(ex.getErrCode());
            }
            resultMsg.setMsg(ex.getErrMsg());
        }else {
            resultMsg.setMsg(CommonErrorMsg.SYSTEM_ERROR.getMessage());
        }
        WebUtil.buildPrintWriter(response, resultMsg);
    }
 
 
}

2.6、測(cè)試相關(guān)注解
@ActiveProfiles
一般作用于測(cè)試類(lèi)上, 用于聲明生效的 Spring 配置文件,比如指定application-dev.properties配置文件。
@RunWith@SpringBootTest
一般作用于測(cè)試類(lèi)上, 用于單元測(cè)試用,示例如下:
@ActiveProfiles("dev")
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestJunit {

    @Test
    public void executeTask() {
        //測(cè)試...
    }
}

三、小結(jié)
整個(gè)篇幅內(nèi)容比較多,比較干,大家在看的過(guò)程中,也沒(méi)有必要去記住,可以先收藏起來(lái),等到需要用到的時(shí)候,再把它拿出來(lái)看看!
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14256
  • MVC
    MVC
    +關(guān)注

    關(guān)注

    0

    文章

    73

    瀏覽量

    13823
  • 開(kāi)發(fā)者
    +關(guān)注

    關(guān)注

    1

    文章

    527

    瀏覽量

    16912
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    172

    瀏覽量

    145
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法

    什么時(shí)候創(chuàng)建嵌入式的Servlet容器工廠?什么時(shí)候獲取嵌入式的Servlet容器并啟動(dòng)Tomcat;獲取嵌入式的Servlet容器工廠:1)、SpringBoot應(yīng)用啟動(dòng)運(yùn)行run方法2
    發(fā)表于 12-20 06:16

    HarmonyOS注解使用方法分享

    定義我們的注解自定義注解1、聲明注解功能:檢測(cè)類(lèi)中是否有規(guī)范的get方法新建java libray的module,命名為annotation,創(chuàng)建
    發(fā)表于 03-28 14:04

    常用手機(jī)焊接工具使用方法

    常用手機(jī)焊接工具使用方法 主要學(xué)習(xí)以下幾點(diǎn) 1、掌握熱風(fēng)槍和電烙鐵的使用方法。2、掌握手機(jī)小元件
    發(fā)表于 03-23 17:40 ?3.2w次閱讀

    示波器探頭常用附件的使用方法

    示波器探頭常用附件的使用方法
    發(fā)表于 01-22 13:38 ?25次下載

    Keil的使用方法 - 常用功能(二)

    Keil的使用方法 - 常用功能(二)
    的頭像 發(fā)表于 04-07 14:55 ?3176次閱讀
    Keil的<b class='flag-5'>使用方法</b> -  <b class='flag-5'>常用</b>功能(二)

    Keil的使用方法 - 常用功能(一)

    Keil的使用方法 - 常用功能(一)
    的頭像 發(fā)表于 04-07 14:51 ?8570次閱讀
    Keil的<b class='flag-5'>使用方法</b> -  <b class='flag-5'>常用</b>功能(一)

    Spring Boot常用注解與使用方式

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

    SpringBoot常用注解使用方法1

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

    Springboot常用注解合集

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

    SpringBoot常用注解及原理

    SpringBootConfiguration繼承自@Configuration,二者功能也一致,標(biāo)注當(dāng)前類(lèi)是配置類(lèi), 并會(huì)將當(dāng)前類(lèi)內(nèi)聲明的一個(gè)或多個(gè)以@Bean注解標(biāo)記的方法的實(shí)例納入到spring容器中,并且實(shí)例名就是方法
    的頭像 發(fā)表于 04-07 14:30 ?509次閱讀

    SpringBoot的核心注解1

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

    SpringBoot的核心注解2

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

    springmvc常用5種注解

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

    springboot核心注解

    幫助開(kāi)發(fā)者簡(jiǎn)化開(kāi)發(fā)過(guò)程,提高開(kāi)發(fā)效率。本文將深入介紹 Spring Boot 的核心注解及其使用方法。 @SpringBootApplication @SpringBootApplication
    的頭像 發(fā)表于 11-23 09:23 ?425次閱讀

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

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