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
開啟基於註解的緩存功能。
閱讀更多 拿渣仨泰舉 的文章