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 {
@Resource
private IYceqService yceqService; 
}

需要注意的是,Service中定义的name和控制层中定义的名称是一致的。

@Controller

注解在类上,表示这是一个控制层bean。在项目中负责把用户发来的URL请求转发到对应Service层去,这个注解一般与RequestMapping配合使用。如

@Controller 
@RequestMapping("/yceq")
public class YceqConstroller {
@Resource
private 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 ListgetAll();
   public List getOrgCache(String parentserialnumber); 
}

要注意的是:这个接口中不可以定义同名的方法,因为会生成相同的id。这个接口不支持重载。

@Component

注解在类上,表示通用bean。无法确定一个bean是属于哪一层(控制层、数据访问层、业务层)的时候使用。使用方法与上述基本一致。

@RestController

等同于Controller和ResponseBody的合集,表示这个类是一个控制器bean(等同于struts中的action),并且函数的返回值直接填入HTTP响应体中。

@RestController 
@RequestMapping(“/demo”) 
public class DemoController2 {
    @RequestMapping("/test")
    public String test(){ 
        //访问 ip:端口/demo/test 会返回字符串ok 
        return"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 {
@Resource
private IYceqService yceqService;
}

它默认是通过名称注入的,所以对应的类的注解的名称是一致的,如下

@Service("yceqService")
public class YceqServiceImpl implements IYceqService {
    private static Logger logger = LoggerFactory.getLogger(YceqServiceImpl.class);
    @Resource
    private IYceqDao yceqDao; 
    public List getOrgInfo(Map map) {
        return yceqDao.getOrgInfo(map);
    }
}

4、其他常用注解

@RequestMapping

提供路由信息,负责URL到Controller中的具体函数的映射。 有几个参数配置

(1)、value

指定请求的地址。

@RestController 
@RequestMapping(“/demo”) 
public class DemoController2 {
    @RequestMapping("/test")
    public String test(){ 
        //访问 ip:端口/demo/test 会返回字符串ok 
        return"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 secures=redisDao.getByName(name); 
    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") 
@Mapper
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 getAll();
    public List getOrgCache(String parentserialnumber);
}

@Transactional

添加事务。

  • 不要在接口上声明 @Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。

  • 可以放在类上,也可以放在方法上。放在类上则类中所有方法都有事务。

  • 使用了 @Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。

  • 使用了 @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);

    @Resource

    private 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 表示采用默认隔离级别。

属性 说明
propagation Propagation枚举
REQUIRED 事务传播属性 (下有说明)
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

开启基于注解的缓存功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容