【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的装配顺序:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBASmVmZkhhbl5fXg==,size_17,color_FFFFFF,t_70,g_se,x_16

 接下来说一下@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. 持续更新中......

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffHan^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值