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 添加位置
- 接口实现类或接口实现方法上,而不是接口类中。
- 访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。
- 系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。
22.2 错误使用
-
接口中A、B两个方法,A无@Transactional标签,B有,上层通过A间接调用B,此时事务不生效。
-
接口中异常(运行时异常)被捕获而没有被抛出。默认配置下,spring 只有在抛出的异常为运行时 unchecked 异常时才回滚该事务,也就是抛出的异常为RuntimeException 的子类(Errors也会导致事务回滚),而抛出 checked 异常则不会导致事务回滚 。可通过 @Transactional rollbackFor进行配置。
-
多线程下事务管理因为线程不属于 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常用的注解有什么
发布评论