springboot开发常用注解总结(典藏版)
目录
springboot开发常用注解总结(典藏版)
前言
本篇文章将会介绍springboot开发中常用的注解。
1 SpringBoot启动
1.1 @SpringBootApplication
-
通常标注在springboot主启动类上。
-
创建springboot项目之后会自动在主启动类上添加。
-
该注解是一个复合注解,有下面三个注解组合而成 @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制 @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。 @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类
2 springBean相关
2.1 @Autowired
-
标注在属性上。
-
默认是将属性名作为组件的id注入到容器中。
-
自动导入对象到类中,注意导入的对象也要被spring容器管理 比如说:service类注入到controller类中。
-
@Service public class UserService { ...... } @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; ...... }
-
该注解默认是优先按照类型去容器中找对应的组件,如果有多个相同类型的组件,再通过按照属性的名称作为组件的id去容器中找。
-
@Autowired(required = false) 默认是true,找不到会报错,设置为false后,找不到也不会报错。
2.2 @Qualifier
-
搭配@Autowired注解使用,可以指定组件的名称,而不是使用属性名。
-
自己指定组件的名称
@Autowired @Qualifier(value="bookDao2") private BookDao bookDao;
2.3 @Resource
- 标注在属性上
- 默认按照名称进行自动装配,几乎和@Autowired注解功能一样,只不过不支持自定义。@Autowired(required = false) 和@Primary
2.4 @Component(通用)、@Service(service层、@Controller(controller层)、@Repository(DAO层)
- 标注在类上
- 要想把类标识成可以被@Autowired注解自动装配的bean的类,就需要加入这些注解。
2.5 @RestController
- 标注在类上,标识该类是一个控制器bean
- @Controller和@ResponseBody的合集。REST风格 ;前后端不分离。
- 将函数的返回值直接填入到HTTP响应体中,返回JSON或XML数据,显示在浏览器。因为如果只是使用@Controller(传统springmvc应用)的话,我们一般都是返回一个视图。
2.6 @Scope
-
设置作用域
-
标注在bean方法对象上,不用设置,因为默认是单实例。我们常用的也是单实例。
-
@Scope("prototype") --- 设置组件为多实例,ioc容器启动不会重新调用方法创建对象放到ioc容器中,每次获取的时候才会调用,获取一次创建一次 @Scope("singleton") --- 设置组件为单实例,ioc容器启动会调用方法创建对象放到ioc容器中,以后每次获取都是直接从容器中拿。
2.7 @Configuration
-
标注在类上
-
将类设置为配置类
2.8 @Bean
-
标注在方法上
-
设置该方法的返回值作为spring管理的bean
-
@Configuration public class SpringConfiguration { @Bean public Student student(){ return new Student(11,"jack",22); } }
3 REST风格 — 处理常见的HTTP请求类型
常见的4种请求类型
* GET请求 :请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
* POST请求 :在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
* PUT请求 :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)
* DELETE请求 :从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)
3.1 @GetMapping
-
标注在方法上
-
@GetMapping("users") 等价于 @RequestMapping(value="/users",method=RequestMethod.GET)
3.2 @POSTMapping
-
标注在方法上
-
@PostMapping("users") 等价于 @RequestMapping(value="/users",method=RequestMethod.POST)
3.3 @PutMapping
-
标注在方法上
-
@PutMapping("/users/{userId}") 等价于 @RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)
3.4 @DeleteMapping
-
标注在方法上
-
@DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)
3.5 @RequestMapping
- 标注在方法上或者类上(一般是方法上)
- 这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上
4 前后端传值
4.1 @PathVariable
-
标注在形参
-
接收路径参数,使用{参数名称}描述路径参数
-
获取url中的数据
-
@GetMapping("/klasses/{klassId}") public List<Teacher> getKlassRelatedTeachers( @PathVariable("klassId") Long klassId ) { ... } 如果我们请求的url是这个:/klasses/{123456} 那么123456这个值就会传入到被@PathVariable标注的对应的形参上,即klassId = 123456
4.2 @RequestParam
-
标注在形参
-
绑定请求参数和处理器形参之间的关系
-
获取请求参数的值
-
@RequestMapping("/getUser") public String getUser(@RequestParam("uid")Integer id, Model model) { System.out.println("id:"+id); return "user"; } 请求地址:http://localhost:8080/User/getUser?uid=123 那么我们形参中id的值就是123.
4.3 @RequestBody
-
标注在形参
-
读取请求的body部分且Content-Type 为 application/json格式的数据,接收到数据之后会自动将数据绑定到 java对象上。
-
@PostMapping("/payment/create") public CommonResult create(@RequestBody Payment payment){ int result = paymentService.create(payment); log.info("*****插入结果:"+result); if(result > 0){ return new CommonResult(200,"插入数据库成功,serverport:"+serverPort,result); }else { return new CommonResult(444,"插入数据库失败",null); } } 我们使用postman这类工具,进行post请求,传入数据。
5 读取配置信息
5.1 @Value
-
标注在字段、方法、参数及注解上
-
作用:读,然后赋值
-
1.基本数值 @Value("张三") private String name; 2.可以写SpEL:#{} @Value("#{20-2}") private Integer age; 3.可以写${},取出配置文件(properties、yml ...)中的值 @Value("${person.nickName}") # 在配置文件中的写法:person.nickName=张三 private String nickName;
5.2 @ConfigurationProperties
-
标注在类上
-
和@Value一样可以读取配置文件的信息
-
比如有一个application.yml文件 library: location: 湖北武汉加油中国加油 books: - name: 天才基本法 description: 二十二岁的林朝夕在父亲确诊阿尔茨海默病这天,得知自己暗恋多年的校园男神裴之即将出国深造的消息——对方考取的学校,恰是父亲当年为她放弃的那所。 - name: 时间的秩序 description: 为什么我们记得过去,而非未来?时间“流逝”意味着什么?是我们存在于时间之内,还是时间存在于我们之中?卡洛·罗韦利用诗意的文字,邀请我们思考这一亘古难题——时间的本质。 - name: 了不起的我 description: 如何养成一个新习惯?如何让心智变得更成熟?如何拥有高质量的关系? 如何走出人生的艰难时刻? @Component @ConfigurationProperties(prefix = "library") class LibraryProperties { @NotEmpty private String location; private List<Book> books; @Setter @Getter @ToString static class Book { String name; String description; } 省略getter/setter ...... }
5.3 @PropertySource
-
标注在类上
-
读取配置文件中的值
-
@Component @PropertySource("classpath:website.properties") class WebSite { @Value("${url}") private String url; 省略getter/setter ...... }
6 数据库实体类相关
6.1 @Table @Entity @Id @GeneratedValue
-
@Table @Entity 标注在类上
-
@Id @ @GeneratedValue 标注在属性上
-
@Table 设置表名(当实体类的名字和数据库中名字不一致或者不符合规范命名的时候使用)
-
@Entity 声明一个类对应一个数据库实体
-
@Id 声明一个字段为主键
-
@GeneratedValue 声明主键的生成策略
-
@Entity @Table(name = "role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String description; 省略getter/setter...... }
6.2 @Param
- 标注在形参位置
- 作用:赋值
- 专门为SQL服务的
- 在形参位置标注,外部传入形参对应的值,值会赋给SQL语句中,进行动态sql.
- 例子:
-
public User selectUser(@Param("userName") String name,@Param("password") String pwd);
<select id="selectUser" resultMap="User"> select * from user where user_name = #{userName} and user_password=#{password}
-
我们在方法中相应的形参位置标注了
@Param("userName") String name
,然后xml映射文件中sql语句,我们是user_name = #{userName}
。那么当外部调用方法传入userName具体的值时,相应的sql语句中user_name的值就是我们传入的值。 -
当一个实体类有很多属性时,如果一个一个的写在形参上会很冗余,我们也可以直接是通过一个整个实体类,通过@Param标识一个实体类来进行。
public List<User> getAllUser(@Param("user") User u);
<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper"> select from user t where 1=1 and t.user_name = #{user.userName} and t.user_age = #{user.userAge} </select>
-
几个注意点:
当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},KaTeX parse error: Expected 'EOF', got '#' at position 36: …解声明参数的时候,必须使用的是#̲{}来取参数。使用{}方式取值会报错。
7 事务
7.1 @Transactional
-
标注在类上或者方法上
-
在要开启事务的方法上使用@Transactional注解
-
我们知道 Exception 分为运行时异常 RuntimeException 和非运行时异常。在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。
-
作用于类:当把@Transactional 注解放在类上时,表示所有该类的public 方法都配置相同的事务属性信息。 作用于方法:当类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。
8 测试相关
8.1 @Test
-
标注在方法上
-
声明一个方法为测试方法
-
@Test void should_import_student_success() throws Exception { ...... }
9 整合相关
9.1 @ComponentScan
-
标注在类上
-
扫描注解(扫描被@Component、@Service、@Controller、@Repository)注解的bean
-
包扫描:
-
@ComponentScan(value="com.atguigu") //设置哪些不扫描 excludeFilters = Filter[] 指定扫描的时候按照什么规则排除哪些组件,不包含哪些组件 //type是指按哪种类型来进行过滤,classes为一个数组,里面为具体的过滤条件实体。 @ComponentScan(value="com.atguigu",excludeFilters = { @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Service.class}) }) //includeFilter =Filter[] 只包含哪些组件,必须设置useDefaultFilters = false,禁用默认全局扫描 @ComponentScan(value="com.atguigu",includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}) },useDefaultFilters = false ) //设置多个扫描策略 @ComponentScans( value={ @ComponentScan(value="com.atguigu",includeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class}) },useDefaultFilters = false ) ,@ComponentScan(value="com.atguigu",excludeFilters = { @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = {Service.class}) })} )
9.2 @Import
-
标注在类上
-
导入配置类
-
@SpringBootApplication @Import({SmsConfig.class}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
后记
目前只是一部分注解,后面还会用到的会继续进行补充。