SpringBoot常用的注解有什么

    • 1. @SpringBootApplication
    • 2. @EnableAutoConfiguration(不用管)
    • 3. @Configuration
    • 4. @Autowired
    • 5. @Qualifier
    • 6. @Controller
    • 7. @RestController
    • 8. @RequestMapping
    • 9. @ComponentScan
    • 10. @Service
    • 11. @ResponseBody
    • 12 @RequestBody
    • 13. @Bean
    • 14. @Resource
    • 15. @RequestParam
    • 16. @PathVariable
    • 17 @Profiles
    • 18. @ConfigurationProperties
    • 19. @EnablCaching
    • 20. @Suppresswarnings
    • 21. @Transactional
      • 21.1 添加位置
      • 22.2 错误使用
    • 23. @Value
    • 24. @Component
    • 25. @Scope
    • 26. @PostConstruct
    • 27. @PreDestroy
    • 28. @Repository

1. @SpringBootApplication

这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。

实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。

由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

2. @EnableAutoConfiguration(不用管)

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

  • 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;

  • 去重,并将exclude和excludeName属性携带的类排除;

  • 过滤,将满足条件(@Conditional)的自动配置类返回;

3. @Configuration

用于定义配置类,指出该类是 Bean 配置的信息源,相当于传统的xml配置文件,一般加在主类上。

如果有些第三方库需要用到xml文件,建议仍然通过@Configuration类作为项目的配置主类——可以使用@ImportResource注解加载xml配置文件。

4. @Autowired

按类型注入。

默认属性required= true,当不能确定 Spring 容器中一定拥有某个类的Bean 时, 可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false), 这等于告诉Spring:在找不到匹配Bean时也不抛出BeanCreationException 异常。

@Autowired 和 @Qualifier 结合使用时,自动注入的策略就从 byType 转变byName 。

@Autowired
@Qualifier("userService") 
UserService userService;

@Autowired
@Qualifier("userService1") 
UserService userService1;
//按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。

@Autowired可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将 @Autowired 和 @Qualifier 统一成一个注释类。

5. @Qualifier

当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用

6. @Controller

注解在类上,表示这是一个控制层bean。

7. @RestController

用于标注控制层组件,表示这是个控制器bean,并且是将函数的返回值直接填入HTTP响应体中,是REST风格的控制器;它是@Controller和@ResponseBody的合集。

8. @RequestMapping

RequestMapping是一个用来处理请求地址映射的注解;提供路由信息,负责URL到Controller中的具体函数的映射,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

@RequestMapping(method = RequestMethod.GET) 省略可写成 @GetMapping

@RequestMapping(method = RequestMethod.POST) 省略可写成 @PostMapping

@RequestMapping(method = RequestMethod.PUT) 省略可写成 @PutMapping

@RequestMapping(method = RequestMethod.DELETE) 省略可写成 @DeleteMapping

9. @ComponentScan

组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。

@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

10. @Service

一般用于修饰service层的组件

11. @ResponseBody

表示该方法的返回结果直接写入HTTP response body中,表示被标记的方法返回的不是路径而是Json对象。

一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@responsebody后,会直接返回json数据

@RequestMapping(value = "person/login")
@ResponseBody // 将请求中的数据写入 Person 对象中
public Person login(@RequestBody Person person) {
	// 不会被解析为跳转路径,而是直接写入 HTTP 响应正文中
	return person; 
}

页面异步请求:

function login() {
    var datas = '{"name":"' + $('#name').val() + '","id":"' + $('#id').val() + '","status":"' + $('#status').val() + '"}';
    $.ajax({
        type : 'POST',
        contentType : 'application/json',
        url : "${pageContext.request.contextPath}/person/login",
        processData : false,
        dataType : 'json',
        data : datas,
        success : function(data) {
            alert("id: " + data.id + "name: " + data.name + "status: "+ data.status);
        },
        error : function() {
            alert('Sorry, it is wrong!');
        }
    });
};

12 @RequestBody

@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

13. @Bean

相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

14. @Resource

@Resource(name=“name”,type=“type”)

@Resource和@Autowired注解都是用来实现依赖注入的。
只是@AutoWried按by type自动注入,而@Resource默认按byName自动注入。

@Resource是JSR-250提供的

  • 默认按名称装配,当找不到名称匹配的bean再按类型装配。
  • 可以写在成员属性上,或写在setter方法上。
  • 可以通过@Resource(name=“beanName”) 指定被注入的bean的名称, 要是未指定name属性,默认使用成员属性的变量名,一般不用写name属性。
  • @Resource(name=“beanName”)指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了。

15. @RequestParam

将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

语法:@RequestParam(value=”参数名”,required=true/false,defaultValue=””)
 
value:参数名
 
required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
 
defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,
如果没有传该参数,就使用默认值

使用@RequestParam时,URL是这样的:http://host:port/path?参数名=参数值

public ModelAndView test16(@RequestParam("name")String name){
    ··············
}

16. @PathVariable

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过

@PathVariable(“xxx”) 绑定到操作方法的入参中。

使用@PathVariable时,URL是这样的:http://host:port/path/参数值

    @GetMapping("/getUserById/{name}")
    public User getUser(@PathVariable("name") String name){
        return userService.selectUser(name);
    }

若方法参数名称和需要绑定的uri中变量名称一致时,可以简写:

    @GetMapping("/getUser/{name}")
    public User getUser(@PathVariable String name){
        return userService.selectUser(name);
    }

17 @Profiles

Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。

通过@Profile注解匹配active参数,动态加载内部配置 。

.@Profile注解使用范围:@Configration 和 @Component 注解的类及其方法,其中包括继承了@Component的注解:@Service、@Controller、@Repository等…

我们除application.properties外,还可以根据命名约定( 命名格式:application-{profile}.properties)来配置,如果active赋予的参数没有与使用该命名约定格式文件相匹配的话,app则会默认从名为application-default.properties 的配置文件加载配置。

如:spring.profiles.active=hello-world,sender,dev 有三个参数,其中 dev 正好匹配下面配置中的application-dev.properties 配置文件,所以app启动时,项目会先从application-dev.properties加载配置,再从application.properties配置文件加载配置,如果有重复的配置,则会以application.properties的配置为准。

如此,我们就不用为了不同的运行环境而去更改大量的环境配置了(此处,dev、pro、test分别为:开发、生产、测试环境配置)

18. @ConfigurationProperties

Spring Boot可使用注解的方式将自定义的properties文件映射到实体bean中,比如config.properties文件。

19. @EnablCaching

@EnableCaching注解是spring framework中的注解驱动的缓存管理功能。自spring版本3.1起加入了该注解。如果你使用了这个注解,那么你就不需要在XML文件中配置cache manager。

20. @Suppresswarnings

抑制警告

21. @Transactional

@Transactional 是声明式事务管理 编程中使用的注解

21.1 添加位置

  1. 接口实现类或接口实现方法上,而不是接口类中。
  2. 访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。
  3. 系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。

22.2 错误使用

  1. 接口中A、B两个方法,A无@Transactional标签,B有,上层通过A间接调用B,此时事务不生效。

  2. 接口中异常(运行时异常)被捕获而没有被抛出。默认配置下,spring 只有在抛出的异常为运行时 unchecked 异常时才回滚该事务,也就是抛出的异常为RuntimeException 的子类(Errors也会导致事务回滚),而抛出 checked 异常则不会导致事务回滚 。可通过 @Transactional rollbackFor进行配置。

  3. 多线程下事务管理因为线程不属于 spring 托管,故线程不能够默认使用 spring 的事务, 也不能获取spring 注入的 bean 。在被 spring 声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制。一个使用了@Transactional 的方法,如果方法内包含多线程的使用,方法内部出现异常,不会回滚线程中调用方法的事务。

23. @Value

不通过配置文件的注入属性的情况

通过@Value将外部的值动态注入到Bean中,使用的情况有:

  • 注入普通字符串
  • 注入操作系统属性
  • 注入表达式结果
  • 注入其他Bean属性:注入beanInject对象的属性another
  • 注入文件资源
  • 注入URL资源
    @Value("normal")
    private String normal; // 注入普通字符串

    @Value("#{systemProperties['os.name']}")
    private String systemPropertiesName; // 注入操作系统属性

    @Value("#{ T(java.lang.Math).random() * 100.0 }")
    private double randomNumber; //注入表达式结果

    @Value("#{beanInject.another}")
    private String fromAnotherBean; // 注入其他Bean属性:注入beanInject对象的属性another,类具体定义见下面

    @Value("classpath:com/hry/spring/configinject/config.txt")
    private Resource resourceFile; // 注入文件资源

    @Value("http://www.baidu")
    private Resource testUrl; // 注入URL资源

24. @Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

25. @Scope

定义Bean的作用域和生命过程

@Scope("prototype")
//值有:singleton,prototype,session,request,globalSession
//       单例      原型       回话   请求      全局回话

26. @PostConstruct

相当于init-method,使用在方法上,当Bean初始化时执行。

27. @PreDestroy

相当于destory-method,使用在方法上,当Bean销毁时执行。

28. @Repository

@Repository 
@Repository("Bean的名称")

定义DAO层Bean

参考:@PathVariable 映射 URL 绑定的占位符
使用 spring.profiles.active 及 @profile 注解 动态化配置内部及外部配置
Springboot常用注解大全
Spring Boot有哪些常用注解?
@Transactional 详解
@Value注入
@ResponseBody和@RequestBody的区别

这里也有:SpringBoot中必须掌握的45个注解

更多推荐

SpringBoot常用的注解有什么