admin管理员组

文章数量:1794759

【SpringBoot】springboot下常用的注解含义讲解

【SpringBoot】springboot下常用的注解含义讲解

 

目录

1. @Component,@Repository,@Service,@Controller

2. @Component注解和@Bean注解的区别

3. @Autowired与@Resource

3.1 @Autowired

3.2 @Qualifier和@Primary

3.3 @Resource

4. @Value和@ConfigurationProperties

5. @RequestParam,@RequestPart,@RequestBody

6. 持续更新中......


1. @Component,@Repository,@Service,@Controller

先来说说这几个比较简单的注解,这些注解是用来向Spring容器内注入Bean的,在类上将这些注解标注出来之后,这些类在Spring启动时,会注册到Bean中。这四种的区别主要表示的是规范,没有实际使用上的区别。

  • @Component 通用注解,如果一个Bean不是在传统的MVC三层架构中的某一层时,可使用该注解 。
  • @Repository 表示Dao层的注解,用于数据库操作的Bean。
  • @Service 表示业务层,用于逻辑业务层的Bean。
  • @Controller 表示控制层,用于请求转发调用业务的Bean。

这里就会有人提到,貌似@Bean这个注解和这些注解的功能好像是一样的,都是向Spring容器中注册Bean。

2. @Component注解和@Bean注解的区别

区别一:注册的方式

@Component 是通过类路径扫描来自动装配到Spring容器中的,需要springboot程序启用组件扫描并且包含了被注解的类时才有效,且不论该类中的方法能不能用到,都会在容器中进行管理。

@Bean 相对灵活,通常是在标有该注解的地方才开始定义产生Bean的逻辑,并且,注解可以直接加在方法上。

区别二:使用方式上

如果代码中引入了第三方的类库,想将这个类库交给Spring容器进行管理,此时无法在第三方类库的源码中使用@Component注解进行自动注册的,这时候可以使用@Bean注解把你需要的方法注册进容器中了。

3. @Autowired与@Resource 3.1 @Autowired

是用来自动装配对象的,我们在项目中通常这样使用:

@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper usermapper; public User get(String name){ return usermapper.get(name) } } @RestController @RequestMapping("/user") public class UserController{ @Autowired private UserService userService; public void getUserByName(String name){ User user = userService.get(name); System.out.println(user); } }

这样是可以自动装配成功的,因为@Autowierd注解默认情况下是按照类型进行装配的,也就是byType的方式。

那么当有多个同类型的Bean时,@Autowired该如何抉择呢?

我们什么都不做的情况下,当有两个同类型Bean时,@Autowired注解所在的类启动时会报错

required a single bean,but 2 were found

此时我们需要配合其他注解一起使用:

3.2 @Qualifier和@Primary

@Qualifier配合@Autowired一起使用,当@Autowired发现超过1个以上的Bean时,通过@Qualifier中指定名称,进行byName的查找方式。

@RestController @RequestMapping("/user") public class UserController{ @Qualifier("userServiceImpl") @Autowired private UserService userService; public void getUserByName(String name){ User user = userService.get(name); System.out.println(user); } }

@Primary则是加在注册的Bean上面,目的则是告诉@Autowired,当有2个同类型的Bean出现时,优先加载带@Primary注解的Bean。

@Primary @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper usermapper; public User get(String name){ return usermapper.get(name) } }

如此,我们看一下@Autowired的装配顺序:

 接下来说一下@Resource注解的含义:

3.3 @Resource

注解默认寻找Bean的方式为byName,它的参数有7个,其中最主要的就是name和type,分成以下4中情况:

  • 不指定name,不指定type:按名称查找bean,查不到再按类型查找,找到了进行装配,没找到或找到多个抛出异常
  • 指定name,不指定type:查找与name唯一匹配的Bean,找到进行装配,没找到抛出异常。
  • 不指定name,指定type: 查找与type唯一匹配的bean,找到一个自动装配,没找到或找到多个抛出异常。
  • 指定name,指定type:找到name和type同时匹配的bean,找到自动装配,没找到抛出异常。
4. @Value和@ConfigurationProperties

@Value和@ConfigurationProperties的作用都是获取配置文件中的值,但是在某些方面他们也是有一点区别,我们先来看看如何使用:

这里我们有一个yaml格式的配置文件:

person: lastName: 张三 age: 18

在类中引入配置文件的值:

@Component @ConfigurationProperties(prefix = "person") //指定前缀 public class Person{ private String lastName; private Integer age; } @Component public class Person { @Value("${person.lastName}") private String lastName; @Value("${person.age}") private Integer age; }

两者的区别:

区别内容@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个一个指定
松散绑定(驼峰命名)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持
  • 松散绑定:

@ConfigurationProperties 可以做到last-name 与 lastName的转换

@Value 必须一致

  • SpEL:

@ConfigurationProperties 在配置文件中的格式:person.age=#{11*2} //会报错

@Value("#{11*2}") private Integer age;

  • JSR303数据校验

@Component @ConfigurationProperties(prefix = "person") @Validated public class Person {     //会对lastName的数据合法性进行校验,验证是Eamil     @Email     private String lastName;     }      //@Value 不支持

  • 复杂类型封装

@Value只能取出基本数据类型

5. @RequestParam,@RequestPart,@RequestBody
区别内容        @RequestParam@RequestPart@RequestBody
用于接收前端的ContentType类型

1.application/x-www-form-urlencoded ,

2.multipart/form-data

1.multipart/form-data

1.application/json

2.application/xml

适用于处理的参数类型name-valueJSON,XML,FILEJSON,XML
6. 持续更新中......

 

本文标签: 注解含义常用SpringBoot