SpringBoot常用的一些註解

1、啟動類中常用的註解

@ComponentScan

自動掃描組件,可自動發現和裝配一些Bean。(如Controller、Service、Component 、Repository 等)

@Configuration

用於定製配置類,相當於spring的xml文件。在類中添加這個註解相當於把這個類做為spring的配置文件中的。如果有些第三方庫需要用到xml文件,可通過@Configuration類作為項目的配置主類 。

@EnableAutoConfiguration

嘗試根據你添加的jar依賴自動配置你的Spring應用 。通常放在Application類裡面。

@SpringBootApplication

包含了@ComponentScan、@Configuration和@EnableAutoConfiguration註解的作用。即配置SpringBootApplication後無需再配置上面三個註解,使用三個註解的默認配置。

2、bean的分類標識

@Service

註解在類上,表示這是一個業務層bean。使用方法是在業務實現類上進行註解Service(“name”) 如

@Service("yceqService")

public class YceqServiceImpl implements IYceqService {

}

在需要使用該業務的地方則是通過註解Resource的方式獲取到這個對象,如在控制層中使用的話,則

@Controller

@RequestMapping("/yceq")public class YceqConstroller {

@Resourceprivate IYceqService yceqService;

}

需要注意的是,Service中定義的name和控制層中定義的名稱是一致的。

@Controller

註解在類上,表示這是一個控制層bean。在項目中負責把用戶發來的URL請求轉發到對應Service層去,這個註解一般與RequestMapping配合使用。如

@Controller

@RequestMapping("/yceq")

public class YceqConstroller {

@Resourceprivate IYceqService yceqService;

}

@Repository

註解在類上,表示這是一個數據訪問層bean。使用@Repository註解可以確保DAO或者repositories提供異常轉譯,這個註解修飾的DAO或者repositories類會被ComponetScan發現並配置,同時也不需要為它們提供XML配置項。

@Repository("yceqDao")

public interface IYceqDao {

public List getOrgInfo(Map map);

public void insertOrg(Map map);

public void insertDev(Map map);

public List getOrgInfo2(Map map);

public List<yceqbean> getAll();/<yceqbean>

public List getOrgCache(String parentserialnumber);

}

要注意的是:這個接口中不可以定義同名的方法,因為會生成相同的id。這個接口不支持重載。

@Component

註解在類上,表示通用bean。無法確定一個bean是屬於哪一層(控制層、數據訪問層、業務層)的時候使用。使用方法與上述基本一致。

@RestController

等同於Controller和ResponseBody的合集,表示這個類是一個控制器bean(等同於struts中的action),並且函數的返回值直接填入HTTP響應體中。

@RestController

@RequestMapping(“/demo”)

publicclass DemoController2 {

@RequestMapping("/test")

public String test(){ //訪問 ip:端口/demo/test 會返回字符串okreturn"ok";

}

}

3、bean注入

@Autowired

按類型裝配,如果存在多個同一類型的bean,則可以用@Qualifier(“name”)來指定。如

@Autowired

@Qualifier(value = “demoInfoService”)

private DemoInfoService demoInfoService;

@Resource

按名稱裝配。如果只寫了@Resource則是通過名稱來注入。如果是寫成@Resource(name=”name”,type=”type”)則通過當作的name來注入。

public class YceqConstroller {

@Resourceprivate IYceqService yceqService;

}

它默認是通過名稱注入的,所以對應的類的註解的名稱是一致的,如下

@Service("yceqService")

public class YceqServiceImpl implements IYceqService {

private static Logger logger = LoggerFactory.getLogger(YceqServiceImpl.class);

@Resourceprivate IYceqDao yceqDao;

public List getOrgInfo(Map map) {

return yceqDao.getOrgInfo(map);

}

}

4、其他常用註解

@RequestMapping

提供路由信息,負責URL到Controller中的具體函數的映射。 有幾個參數配置

(1)、value

指定請求的地址。

@RestController

@RequestMapping(“/demo”)

publicclass DemoController2 {

@RequestMapping("/test")

public String test(){ //訪問 ip:端口/demo/test 會返回字符串okreturn"ok";

}

}

前端界面用ajax訪問的話,代碼如下

$.ajax({

type : "POST",

url : "demo/test", //映射的地址

data : data,

dataType : "text",

success : function(msg) {

alert(msg);

}

(2)、method

請求方法類型 這個不寫的話,自適應:get或者post,包含的方法有GET、POST、PUT、DELETE等

@RequestMapping("/home")

public class IndexController {

@RequestMapping(method = RequestMethod.GET)

String get() {

return "Hello from get";

}

@RequestMapping(method = RequestMethod.POST)

String getSpring(){

return "spring";

}

}

前端訪問的話,需要指定Get和Post才能進行訪問

//訪問的是getSpring的方法

$.ajax({

type : "POST",

url : "home",

data : data,

dataType : "text",

success : function(msg) {

alert(msg);

} //訪問的是get的方法

$.ajax({

type : "GET",

url : "home",

data : data,

dataType : "text",

success : function(msg) {

alert(msg);

}

(3)、onsumes

設置請求內容的類型,application/json、text/html等。 如指定內容的類型為json。則該方法只處理Content-Type為“application/json”類型的請求 。

@RequestMapping(value=“/show”,onsumes=”application/json”)

String getJson(){

return "spring";

}

(4)、produces

指定返回的內容類型 僅當request請求頭中的(Accept)類型中包含該指定類型才返回。

@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")

@ResponseBody

public Pet getPet(@PathVariable String petId, Model model) {

// implementation omitted }

即指定返回的內容類型為json。

(5)、params

指定request中必須包含某些參數值,只有存在這些參數才能讓該方法處理請求。

@RequestMapping(value = "/list",method=RequestMethod.GET,params="method=one")

public String getOneUser(@RequestParam(value ="name") String name,Model model) {

Set<groupsecure> secures=redisDao.getByName(name); /<groupsecure>

model.addAttribute("secures", secures);

return "group/list";

}

表示請求的url中需要包括method=one這個參數,才能調用到getOneUser這個方法。

(6)、headers

指定request中必須包含指定的header值。

@RestController

@RequestMapping("/home")

public class IndexController {

@RequestMapping(value = "/head", headers = {

"content-type=text/plain",

"content-type=text/html"

}) String post() {

return "Mapping applied along with headers";

}

}

這樣, post() 方法就能同時接受 text/plain 還有 text/html 的請求了。

@RequestParam

用於獲取前端參數。

如後端寫法

@RequestMapping("/")

public String Demo1(@RequestParam String orgId){

System.out.println("----"+orgId); return null;

}

則前端名稱需要對應:

若前端還是orgId,而後端是id的話,名稱不對應,則可以指定名稱,如下

@RequestMapping("/")

public String Demo1(@RequestParam(value="orgId") String id){

System.out.println("----"+id); return null;

}

也可以給定一個默認值

@RequestMapping("/")

public String Demo1(@RequestParam(value="orgId",defaultValue="3501") String id){

System.out.println("----"+id); return null;

}

可通過添加required來設定參數是否必須傳值

// required=true,則參數必須要傳

@RequestMapping("/")

public String Demo1(@RequestParam(name="orgId",required=true) int id){

System.out.println("----"+id); return null;

}`

@RequestBody

表示該方法的返回結果直接寫入HTTP response body中,一般在異步獲取數據時使用 。返回值通常解析為跳轉路徑,加上@responsebody後返回結果不會被解析為跳轉路徑,而是直接寫入HTTP response body中。比如異步獲取json數據,加上@responsebody後,會直接返回json數據。該註解一般會配合@RequestMapping一起使用。

@RequestMapping(“/test”)

@ResponseBody public String test(){

return”ok”;

}

@PathVariable

路徑變量。 即在路徑中直接使用參數變量進行訪問,如

RequestMapping(“user/get/mac/{macAddress}”)

public String getByMacAddress(@PathVariable String macAddress){

//do something; }

這個方法需要傳入一個macAddress值。假設這個值為100。那麼它的訪問路徑就是

http://IP:端口/應用名/user/get/mac/100

@MapperScan(“com.gotop.xyz.*.dao”)

掃描指定目錄(com.gotop.xyz.*.dao)下的Dao接口,自動生成相應實現類,若接口中已使用到Mapper註解,則無需使用MapperScan註解。使用方法如下

@MapperScan("com.gotop.xyz.*.dao")

@SpringBootApplication

public class HiGotopApplication {

public static void main(String[] args) {

SpringApplication.run(HiGotopApplication.class, args);

}

}

@Mapper

添加了@Mapper註解之後這個接口在編譯時會生成相應的實現類,在IDAO接口類中使用。

@Repository("yceqDao")

@Mapperpublic interface IYceqDao {

public List getOrgInfo(Map map);

public void insertOrg(Map map);

public void insertDev(Map map);

public List getOrgInfo2(Map map);

public List<yceqbean> getAll(); /<yceqbean>

public List getOrgCache(String parentserialnumber);

}

@Transactional

添加事務。

1、不要在接口上聲明 @Transactional ,而要在具體類的方法上使用@Transactional 註解,否則註解可能無效。

2、可以放在類上,也可以放在方法上。放在類上則類中所有方法都有事務。

3、使用了 @Transactional的方法,對同一個類裡面的方法調用, @Transactional無效。比如有一個類Test,它的一個方法A,A再調用Test本類的方法B(不管B是否public還是private),但A沒有聲明註解事務,而B有。則外部調用A之後,B的事務是不會起作用的。

4、使用了 @Transactional 的方法, 只能是public, @Transactional註解的方法都是被外部其他類調用才有效,故只能是public。道理和上面的有關聯。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 註解,它也不會報錯,但事務無效。

經過在ICORE-CLAIM中測試,效果如下:

  • 拋出受查異常XXXException,事務會回滾。
  • 拋出運行時異常NullPointerException,事務會回滾。
  • Quartz中,execute直接調用加了@Transactional方法,可以回滾;間接調用,不會回滾。(即上文3點提到的)
  • 異步任務中,execute直接調用加了@Transactional方法,可以回滾;間接調用,不會回滾。(即上文3點提到的)
  • 在service中加上 @Transactional,如果是action直接調該方法,會回滾,如果是間接調,不會回滾。(即上文3提到的)
  • 在service中的private加上 @Transactional,事務不會回滾。

@Transactional(propagation=Propagation.REQUIRED,readOnly=false,isolation=Isolation.DEFAULT)

@Service("yceqService")

public class YceqServiceImpl implements IYceqService {

private static Logger logger = LoggerFactory.getLogger(YceqServiceImpl.class); @Resourceprivate IYceqDao yceqDao;

public List getOrgInfo(Map map) {

return yceqDao.getOrgInfo(map);

}

}

(1)、propagation

其中propagation表示事務的傳播性,默認值也是REQUIRED。即如果當前沒有事務則創建一個新事物,如果已存在事務則加入該事務。出現異常時,一起回滾。

事務傳播行為類型說明REQUIRED

如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

SUPPORTS

支持當前事務,如果當前沒有事務,就以非事務方式執行。

MANDATORY

使用當前的事務,如果當前沒有事務,就拋出異常。

REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。

NOT_SUPPORTED

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

NEVER

以非事務方式執行,如果當前存在事務,則拋出異常。

NESTED

如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

(2)、readOnly

設置是否只讀。

(3)、isolation

事務隔離級別。DEFAULT 表示採用默認隔離級別。

DEFAULT採用數據庫默認隔離級別READ_UNCOMMITTED

讀未提交數據(會出現髒讀,不可重複讀,幻讀 ,避免了 第一類丟失 更新 )

READ_COMMITTED

讀已提交的數據(會出現不可重複讀,幻讀)

REPEATABLE_READ

可重複讀(會出現幻讀)

SERIALIZABLE

串行化

(4)、Transactional可選屬性

屬性類型默認值說明propagation

Propagation枚舉

REQUIRED

事務傳播屬性 (下有說明)

isolation

isolation枚舉

DEFAULT

事務隔離級別 (另有說明)

readOnly

boolean

false

是否只讀

timeout

int

-1

超時(秒)

rollbackFor

Class[]

{}

需要回滾的異常類

rollbackForClassName

String[]

{}

需要回滾的異常類名

noRollbackFor

Class[]

{}

不需要回滾的異常類

noRollbackForClassName

String[]

{}

不需要回滾的異常類名

@Scope

註解在類上,描述spring容器如何創建Bean實例。

@Scope("prototype")

@Controller

@RequestMapping("/yceq")

public class YceqConstroller {

}

有下面幾種參數:

singleton表示在spring容器中的單例,通過spring容器獲得該bean時總是返回唯一的實例prototype

表示每次獲得bean都會生成一個新的對象

request

表示在一次http請求內有效(只適用於web應用)

session

表示在一個用戶會話內有效(只適用於web應用)

globalSession

表示在全局會話內有效(只適用於web應用)

@Value

註解在變量上,從配置文件中讀取。

@Value(value = “#{message}”)

private String message;

@EnableCaching

開啟基於註解的緩存功能。


分享到:


相關文章: