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
开启基于注解的缓存功能。