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