2.3、JPA 相關(guān)注解
@Entity和@Table
表明這是一個(gè)實(shí)體類,這兩個(gè)注解一般一塊使用,但是如果表名和實(shí)體類名相同的話,@Table可以省略。
@Id
表示該屬性字段對應(yīng)數(shù)據(jù)庫表中的主鍵字段。
@Column
表示該屬性字段對應(yīng)的數(shù)據(jù)庫表中的列名,如果字段名與列名相同,則可以省略。
@GeneratedValue
表示主鍵的生成策略,有四個(gè)選項(xiàng),分別如下:
- AUTO:表示由程序控制,是默認(rèn)選項(xiàng) ,不設(shè)置就是這個(gè)
 - IDENTITY:表示由數(shù)據(jù)庫生成,采用數(shù)據(jù)庫自增長,Oracle 不支持這種方式
 - SEQUENCE:表示通過數(shù)據(jù)庫的序列生成主鍵ID,MYSQL 不支持
 - Table:表示由特定的數(shù)據(jù)庫產(chǎn)生主鍵,該方式有利于數(shù)據(jù)庫的移植
 @SequenceGeneretor
用來定義一個(gè)生成主鍵的序列,它需要與@GeneratedValue聯(lián)合使用才有效,以TB_ROLE表為例,對應(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ù)自增長
     */
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "id_seq")
    private Long id;
    /* 角色名稱
     */
    @Column(nullable = false)
    private String roleName;
    /**
     * 角色類型
     */
    @Column(nullable = false)
    private String roleType;
}
@Transient
表示該屬性并非與數(shù)據(jù)庫表的字段進(jìn)行映射,ORM 框架會將忽略該屬性。
/**
 * 忽略該屬性
 */
@Column(nullable = false)
@Transient
private String lastTime;
@Basic(fetch=FetchType.LAZY)
用在某些屬性上,可以實(shí)現(xiàn)懶加載的效果,也就是當(dāng)用到這個(gè)字段的時(shí)候,才會裝載這個(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配置文件中的一對一,一對多,多對一配置,比如下面的客戶地址表,通過客戶 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 形式的配置類,Spring Boot 提倡基于 Java 的配置,相當(dāng)于你之前在 xml 中配置 bean,比如聲明一個(gè)配置類AppConfig,然后初始化一個(gè)Uploader對象。
@Configuration
public class AppConfig {
    @Bean
    public Uploader initOSSUploader() {
        return new OSSUploader();
    }
}
@EnableAutoConfiguration
@EnableAutoConfiguration可以幫助SpringBoot應(yīng)用將所有符合條件的@Configuration配置類,全部都加載到當(dāng)前SpringBoot里,并創(chuàng)建對應(yīng)配置類的Bean,并把該Bean實(shí)體交給IoC容器進(jìn)行管理。
某些場景下,如果我們想要避開某些配置類的掃描(包括避開一些第三方jar包下面的配置,可以這樣處理。
@Configuration
@EnableAutoConfiguration(exclude = { org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})
public class AppConfig {
 //具有業(yè)務(wù)方法
}
@ComponentScan
標(biāo)注哪些路徑下的類需要被Spring掃描,用于自動發(fā)現(xiàn)和裝配一些Bean對象,默認(rèn)配置是掃描當(dāng)前文件夾下和子目錄下的所有類,如果我們想指定掃描某些包路徑,可以這樣處理。
@ComponentScan(basePackages = {"com.xxx.a", "com.xxx.b", "com.xxx.c"})
@SpringBootApplication
等價(jià)于使用@Configuration、@EnableAutoConfiguration、@ComponentScan這三個(gè)注解,通常用于全局啟動類上,示例如下:
@SpringBootApplication
public class PropertyApplication {
    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}
把@SpringBootApplication換成@Configuration、@EnableAutoConfiguration、@ComponentScan這三個(gè)注解,一樣可以啟動成功,@SpringBootApplication只是將這三個(gè)注解進(jìn)行了簡化!
@EnableTransactionManagement
表示開啟事務(wù)支持,等同于 xml 配置方式的
@SpringBootApplication
@EnableTransactionManagement`
public class PropertyApplication {
    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}
@Conditional
從 Spring4 開始,可以通過@Conditional注解實(shí)現(xiàn)按條件裝載bean對象,目前 Spring Boot 源碼中大量擴(kuò)展了@Condition注解,用于實(shí)現(xiàn)智能的自動化配置,滿足各種使用場景。下面我給大家列舉幾個(gè)常用的注解:
@ConditionalOnBean:當(dāng)某個(gè)特定的Bean存在時(shí),配置生效@ConditionalOnMissingBean:當(dāng)某個(gè)特定的Bean不存在時(shí),配置生效@ConditionalOnClass:當(dāng)Classpath里存在指定的類,配置生效@ConditionalOnMissingClass:當(dāng)Classpath里不存在指定的類,配置生效@ConditionalOnExpression:當(dāng)給定的SpEL表達(dá)式計(jì)算結(jié)果為true,配置生效@ConditionalOnProperty:當(dāng)指定的配置屬性有一個(gè)明確的值并匹配,配置生效
具體的應(yīng)用案例如下:
@Configuration
public class ConditionalConfig {
    /**
     * 當(dāng)AppConfig對象存在時(shí),創(chuàng)建一個(gè)A對象
     * @return
     */
    @ConditionalOnBean(AppConfig.class)
    @Bean
    public A createA(){
        return new A();
    }
    /**
     * 當(dāng)AppConfig對象不存在時(shí),創(chuàng)建一個(gè)B對象
     * @return
     */
    @ConditionalOnMissingBean(AppConfig.class)
    @Bean
    public B createB(){
        return new B();
    }
    /**
     * 當(dāng)KafkaTemplate類存在時(shí),創(chuàng)建一個(gè)C對象
     * @return
     */
    @ConditionalOnClass(KafkaTemplate.class)
    @Bean
    public C createC(){
        return new C();
    }
    /**
     * 當(dāng)KafkaTemplate類不存在時(shí),創(chuàng)建一個(gè)D對象
     * @return
     */
    @ConditionalOnMissingClass(KafkaTemplate.class)
    @Bean
    public D createD(){
        return new D();
    }
    /**
     * 當(dāng)enableConfig的配置為true,創(chuàng)建一個(gè)E對象
     * @return
     */
    @ConditionalOnExpression("${enableConfig:false}")
    @Bean
    public E createE(){
        return new E();
    }
    /**
     * 當(dāng)filter.loginFilter的配置為true,創(chuàng)建一個(gè)F對象
     * @return
     */
    @ConditionalOnProperty(prefix = "filter",name = "loginFilter",havingValue = "true")
    @Bean
    public F createF(){
        return new F();
    }
}
@value
可以在任意 Spring 管理的 Bean 中通過這個(gè)注解獲取任何來源配置的屬性值,比如你在application.properties文件里,定義了一個(gè)參數(shù)變量!
config.name=zhangsan
在任意的bean容器里面,可以通過@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è)類中獲取屬性配置值的做法,其實(shí)是不推薦的。
一般在企業(yè)項(xiàng)目開發(fā)中,不會使用那么雜亂無章的寫法而且維護(hù)也麻煩,通常會一次性讀取一個(gè) Java 配置類,然后在需要使用的地方直接引用這個(gè)類就可以多次訪問了,方便維護(hù),示例如下:
首先,在application.properties文件里定義好參數(shù)變量。
config.name=demo_1
config.value=demo_value_1
然后,創(chuàng)建一個(gè) Java 配置類,將參數(shù)變量注入即可!
@Component
@ConfigurationProperties(prefix = "config")
public class Config {
    public String name;
    public String value;
    //...get、set
}
最后,在需要使用的地方,通過ioc注入Config對象即可!
@PropertySource
這個(gè)注解是用來讀取我們自定義的配置文件的,比如導(dǎo)入test.properties和bussiness.properties兩個(gè)配置文件,用法如下:
@SpringBootApplication
@PropertySource(value = {"test.properties","bussiness.properties"})
public class PropertyApplication {
    public static void main(String[] args) {
        SpringApplication.run(PropertyApplication.class, args);
    }
}
@ImportResource
用來加載 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、測試相關(guān)注解
@ActiveProfiles
一般作用于測試類上, 用于聲明生效的 Spring 配置文件,比如指定application-dev.properties配置文件。
@RunWith和@SpringBootTest
一般作用于測試類上, 用于單元測試用,示例如下:
@ActiveProfiles("dev")
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestJunit {
    @Test
    public void executeTask() {
        //測試...
    }
}
三、小結(jié)
整個(gè)篇幅內(nèi)容比較多,比較干,大家在看的過程中,也沒有必要去記住,可以先收藏起來,等到需要用到的時(shí)候,再把它拿出來看看!
- 
                                spring
                                +關(guān)注
關(guān)注
0文章
341瀏覽量
15695 - 
                                MVC
                                +關(guān)注
關(guān)注
0文章
73瀏覽量
14325 - 
                                開發(fā)者
                                +關(guān)注
關(guān)注
1文章
694瀏覽量
17890 - 
                                SpringBoot
                                +關(guān)注
關(guān)注
0文章
175瀏覽量
595 
發(fā)布評論請先 登錄
SpringBoot應(yīng)用啟動運(yùn)行run方法
HarmonyOS注解的使用方法分享
常用手機(jī)焊接工具使用方法
Spring Boot常用注解與使用方式
SpringBoot常用注解及使用方法1
Springboot常用注解合集
    
SpringBoot常用注解及原理
SpringBoot的核心注解1
    
SpringBoot的核心注解2
    
          
        
        
SpringBoot常用注解及使用方法2
                
 
    
    
           
            
            
                
            
評論