前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试官:Spring 的 @Bean 和 @Component 有什么区别?

面试官:Spring 的 @Bean 和 @Component 有什么区别?

作者头像
JavaFish
发布于 2022-04-18 10:51:35
发布于 2022-04-18 10:51:35
5.9K00
代码可运行
举报
运行总次数:0
代码可运行

哈喽,我是狗哥。今天分享几个不太容易说出其区别或者用途的 Spring 注解,比如 @Component@Bean 的比较,@ControllerAdvice 是如何处理自定义异常的等等。

Spring 中的一些注解

@Component 和 @Bean 的区别是什么?

  1. 作用对象不同:@Component 注解作用于类,而 @Bean 注解作用于方法、
  2. @Component 通常是通过路径扫描来自动侦测以及自动装配到 Spring 容器中(我们可以使用 @ComponentScan 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。@Bean 注解通常是我们在标有该注解的方法中定义产生这个 bean,@Bean 告诉了 Spring 这是某个类的实例,当我们需要用它的时候还给我。
  3. @Bean 注解比 @Component 注解的自定义性更强,而且很多地方我们只能通过 @Bean 注解来注册 bean。比如当我们引用第三方库中的类需要装配到 Spring 容器时,只能通过 @Bean 来实现。

@Bean 注解使用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class AppConfig {
    @Bean
public TransferService transferService() {
return new TransferServiceImpl();
    }
}

@Component 注解使用示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Component
public class ServiceImpl implements AService {
    ....
}

下面这个例子是通过 @Component 无法实现的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Bean
public OneService getService(status) {
 case (status)  
    {
        when 1:
            return new serviceImpl1();
        when 2:
            return new serviceImpl2();
        when 3:
            return new serviceImpl3();
    }
}

@Autowire 和 @Resource 的区别

  1. @Autowire@Resource都可以用来装配bean,都可以用于字段或setter方法。
  2. @Autowire 默认按类型装配,默认情况下必须要求依赖对象必须存在,如果要允许 null 值,可以设置它的 required 属性为 false。
  3. @Resource 默认按名称装配,当找不到与名称匹配的 bean 时才按照类型进行装配。名称可以通过 name 属性指定,如果没有指定 name 属性,当注解写在字段上时,默认取字段名,当注解写在 setter 方法上时,默认取属性名进行装配。

“注意:如果 name 属性一旦指定,就只会按照名称进行装配。 ”

@Autowire@Qualifier配合使用效果和@Resource一样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired(required = false) @Qualifier("example")
private Example example;

@Resource(name = "example")
private Example example;

@Resource 装配顺序

  1. 如果同时指定 name 和 type,则从容器中查找唯一匹配的 bean 装配,找不到则抛出异常;
  2. 如果指定 name 属性,则从容器中查找名称匹配的 bean 装配,找不到则抛出异常;
  3. 如果指定 type 属性,则从容器中查找类型唯一匹配的 bean 装配,找不到或者找到多个抛出异常;
  4. 如果不指定,则自动按照 byName 方式装配,如果没有匹配,则回退一个原始类型进行匹配,如果匹配则自动装配。

将一个类声明为 Spring 的 bean 的注解有哪些?

  • @Component :通用的注解,可标注任意类为 Spring 的组件。如果一个 Bean 不知道属于哪个层,可以使用 @Component 注解标注。
  • @Repository :对应持久层即 Dao 层,主要用于数据库相关操作。
  • @Service :对应服务层,主要设计一些复杂的逻辑,需要用到 Dao 层。
  • @Controller :对应 Spring MVC 控制层,主要用来接受用户请求并调用 Service 层返回数据给前端页面。
  • @Configuration :声明该类为一个配置类,可以在此类中声明一个或多个 @Bean 方法。

@Configuration :配置类注解

@Configuration 表明在一个类里可以声明一个或多个 @Bean 方法,并且可以由 Spring 容器处理,以便在运行时为这些 bean 生成 bean 定义和服务请求,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class AppConfig {

 @Bean
 public MyBean myBean() {
 // instantiate, configure and return bean ...
    }
}

我们可以通过 AnnotationConfigApplicationContext 来注册 @Configuration 类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(AppConfig.class);
ctx.refresh();
MyBean myBean = ctx.getBean(MyBean.class);
// use myBean ...

另外也可以通过组件扫描(component scanning)来加载,@Configuration 使用 @Component 进行原注解,因此 @Configuration 类也可以被组件扫描到(特别是使用 XML 的 元素)。@Configuration 类不仅可以使用组件扫描进行引导,还可以使用 @ComponentScan 注解自行配置组件扫描:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@ComponentScan("com.acme.app.services")
public class AppConfig {
 // various @Bean definitions ...
}

使用 @Configuration 的约束:

  • 配置类必须以类的方式提供(比如不能是由工厂方法返回的实例)。
  • 配置类必须是非 final 的。
  • 配置类必须是非本地的(即可能不在方法中声明),native 标注的方法。
  • 任何嵌套的配置类必须声明为 static。
  • @Bean 方法可能不会反过来创建更多的配置类。

除了单独使用 @Configuration 注解,我们还可以结合一些外部的 bean 或者注解共同使用,比如 Environment API@PropertySource@Value@Profile 等等许多,这里就不做详细介绍了,更多的用法可以参看 Spring @Configuration 的相关文档 。

@ControllerAdvice :处理全局异常利器

在 Spring 3.2 中,新增了 @ControllerAdvice@RestControllerAdvice@RestController 注解,可以用于定义 @ExceptionHandler@InitBinder@ModelAttribute,并应用到所有 @RequestMapping@PostMapping@GetMapping等这些 Controller 层的注解中。

默认情况下,@ControllerAdvice 中的方法应用于全局所有的 Controller。而使用选择器 annotations()basePackageClasses()basePackages() (或其别名value())来定义更小范围的目标 Controller 子集。如果声明了多个选择器,则应用 OR 逻辑,这意味着所选的控制器应匹配至少一个选择器。请注意,选择器检查是在运行时执行的,因此添加许多选择器可能会对性能产生负面影响并增加复杂性。

@ControllerAdvice 我们最常使用的是结合 @ExceptionHandler 用于全局异常的处理。可以结合以下例子,我们可以捕获自定义的异常进行处理,并且可以自定义状态码返回:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ControllerAdvice("com.developlee.errorhandle")
public class MyExceptionHandler {
    /**
     * 捕获CustomException
     * @param e
     * @return json格式类型
     */
    @ResponseBody
    @ExceptionHandler({CustomException.class}) //指定拦截异常的类型
 @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) //自定义浏览器返回状态码
    public Map>String, Object< customExceptionHandler(CustomException e) {
        Map<String, Object> map = new HashMap<>();
  map.put("code", e.getCode());
  map.put("msg", e.getMsg());
  return map;
    }
}

更多信息可以参看 Spring @ControllerAdvice 的官方文档。

@Component, @Repository, @Service 的区别

注解

含义

@Component

最普通的组件,可以被注入到 Spring 容器进行管理

@Repository

作用于持久层

@Service

作用于业务逻辑层

@Controller

作用于表现层(spring-mvc的注解)

@Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。

因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller 来替代它,同时这些注解会具备有更多的功能,而且功能各异。

最后,如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。

总结

以上简单介绍了几种 Spring 中的几个注解及代码示例,就我个人而言,均是平时用到且不容易理解的几个,或者容易忽略的几个。当然,这篇文章并没有完全介绍完,在今后还会继续补充完善。

参考链接

  • blog.csdn.net/weixin_35544490/article/details/112143211
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个优秀的废人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
聊聊统一认证中的四种安全认证协议(干货分享)
   在开发的过程中,常常听说认证(Authentication)和授权(Authorization),它们的缩写都为auth,所以非常容易混淆。
陈哈哈
2023/11/01
4K0
聊聊统一认证中的四种安全认证协议(干货分享)
SAML和OAuth2这两种SSO协议的区别
SSO是单点登录的简称,常用的SSO的协议有两种,分别是SAML和OAuth2。本文将会介绍两种协议的不同之处,从而让读者对这两种协议有更加深入的理解。
程序那些事
2020/12/31
4.2K0
SAML和OAuth2这两种SSO协议的区别
单点登录协议有哪些?CAS、OAuth、OIDC、SAML有何异同?
单点登录实现中,系统之间的协议对接是非常重要的一环,一般涉及的标准协议类型有 CAS、OAuth、OpenID Connect、SAML,本文将对四种主流 SSO协议进行概述性的介绍,并比较其异同,读者亦可按图索骥、厘清关键概念。
玉符IDaaS
2020/10/22
29.6K2
【小家思想】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案)
OAuth是一个关于授权(authorization)的开放网络协议,在全世界得到广泛应用,目前的版本是2.0版。
YourBatman
2019/09/03
18.7K0
【小家思想】通俗易懂版讲解JWT和OAuth2,以及他俩的区别和联系(Token鉴权解决方案)
详解 Cookie,Session,Token
很久很久之前, Web基本都是文档的浏览而已。既然是浏览, 作为服务器, 不需要记录在某一段时间里都浏览了什么文档, 每次请求都是一个新的HTTP协议,就是请求加响应。不用记录谁刚刚发了HTTP请求, 每次请求都是全新的。
木子星兮
2020/10/09
2.1K0
详解 Cookie,Session,Token
微服务统一认证与授权的 Go 语言实现(上)
各位读者朋友鼠年大吉,祝各位新的一年身体健康,万事如意! 最近疫情严重,是一个特殊时期,大家一定要注意防护。很多省份推迟了企业开工的时间,大部分的互联网公司也都是下周开始远程办公。大家可以利用在家的
aoho求索
2020/02/25
3.6K0
认证授权的设计与实现
每个网站,小到一个H5页面,必有一个登录认证授权模块,常见的认证授权方式有哪些呢?又该如何实现呢?下面我们将来讲解SSO、OAuth等相关知识,并在实践中的应用姿势。
ruochen
2021/11/25
1.4K0
一文看懂认证安全问题总结篇
研究认证相关的安全问题也有一段实践了,今天就对认证相关的安全问题做个总结。其中涉及到一些前置概念这里无法一一讲解,可以在相关RFC文档或者链接中深入阅读,笔者已经把相关资料整理收录在参考链接。本文更多的是对认证相关的安全问题做个总结。另外文中引用了一些网络中的图片,由于来源不一,所以就不逐个标明,在此一并感谢。
FB客服
2019/05/14
1.9K0
一文看懂认证安全问题总结篇
OAuth 详解<1> 什么是 OAuth?
从高层次开始,OAuth 不是API或服务:它是授权的开放标准,任何人都可以实施它。
用户1418987
2023/04/10
4.9K0
OAuth 详解<1> 什么是 OAuth?
感性认识JWT
关于JWT,相信很多人都已经看过用过,他是基于json数据结构的认证规范,简单的说就是验证用户登没登陆的玩意。这时候你可能回想,哎哟,不是又那个session么,分布式系统用redis做分布式session,那这个jwt有什么好处呢?
猿天地
2018/12/26
1.1K0
对比授权机制,你更想用哪种?
授权机制,当我们说到这个问题的时候,大家对它的第一印象是在哪个地方呢?是不是曾经某培训机构教授的 SSO 单点登录的,是的没错,而这种 SSO 的单点登录在当年的培训机构中,使用的就是 Session 共享,也就是用 Redis 做中间模拟 Session ,但是授权机制真的有这么简单么?接下来阿粉就来强势对比一下关于授权机制了。
Java极客技术
2022/12/02
6910
对比授权机制,你更想用哪种?
SSO的通用标准OpenID Connect
OpenID Connect简称为OIDC,已成为Internet上单点登录和身份管理的通用标准。它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准协议。
程序那些事
2020/12/31
1.7K0
基于 Spring Security OAuth2和 JWT 构建保护微服务系统
常见的应用场景如下图,用户通过浏览器进行登录,一旦确定用户名和密码正确,那么在服务器端使用秘钥创建 JWT,并且返回给浏览器;接下来我们的请求需要在头部增加 jwt 信息,服务器端进行解密获取用户信息,然后进行其他业务逻辑处理,再返回客户端
allsmallpig
2021/02/25
1.2K0
什么是JWT?
JSON Web Token (JWT) 是一个开源标准(RFC 7519),它定义了一种紧凑且自完备的方法用于在各参与方之间以JSON对象传递信息。以该种方式传递的信息已经被数字签名,因而可以被验证并且被信任。JWT既可以使用盐(secret)(HMAC算法)进行签名,也可以使用基于RSA/ECDSA算法的公钥/秘钥对进行签名。
Steve Wang
2022/04/13
9590
什么是JWT?
在wildfly中使用SAML协议连接keycloak
我们知道SSO的两个常用的协议分别是SAML和OpenID Connect,我们在前一篇文章已经讲过了怎么在wildfly中使用OpenID Connect连接keycloak,今天我们会继续讲解怎么使用SAML协议连接keycloak。
程序那些事
2020/12/31
2.3K0
[译] 深入 OAuth2.0 和 JWT
从基于计算机的应用出现伊始,几乎每个开发者在其职业生涯内都会面对的一个最常见也是最复杂的问题,就是安全性(security)。这类问题意味着要考虑理解由谁提供什么数据/信息,此外还有关乎时间、校验、再校验等诸如此类的很多其他方面的事情。
江米小枣
2020/06/15
3.2K0
使用开源 MaxKey 与 APISIX 网关保护你的 API
Apache APISIX 是 Apache 软件基金会下的云原生 API 网关,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布(金丝雀发布)、服务熔断、身份认证、可观测性等丰富的流量管理功能。我们可以使用 Apache APISIX 来处理传统的南北向流量,也可以处理服务间的东西向流量。同时,它也支持作为 K8s Ingress Controller 来使用。
MaxKey单点登录开源官方
2023/02/17
2.9K0
使用开源 MaxKey 与 APISIX 网关保护你的 API
到底什么是认证?什么是授权?
认证 (Authentication) 是根据凭据验明访问者身份的流程。即验证“你是你所说的那个人”的过程。
程序视点
2025/01/17
2520
到底什么是认证?什么是授权?
基于OIDC实现单点登录SSO、第三方登录[通俗易懂]
认证(Authentication) 认证是指应用软件(身份信息使用方)通过采用某种方法来确认当前请求的用户是谁。基于密码的认证过程可以细分为三步: (1)认证服务器(身份信息提供方)从客户端获取用户账密。 (2)认证服务器将拿到的账密与数据库中保存的账密进行比较,确认正确后,生成用户身份信息。 (3)使用方从提供方处获取用户身份信息。
全栈程序员站长
2022/09/27
7K0
基于OIDC实现单点登录SSO、第三方登录[通俗易懂]
15分钟详解 Python 安全认证的那些事儿~
系统安全可能往往是被大家所忽略的,我们的很多系统说是在互联网上"裸奔"一点都不夸张,很容易受到攻击,系统安全其实是一个复杂且庞大的话题,若要详细讲来估计用几本书的篇幅都讲不完,基于此本篇及下一篇会着重讲解在我们开发系统过程中遇到的一些安全校验机制,希望能起到抛砖引玉的作用,望各位在开发过程中多多思考不要只局限于功能实现上,共勉~
python编程从入门到实践
2021/04/14
2K0
15分钟详解 Python 安全认证的那些事儿~
相关推荐
聊聊统一认证中的四种安全认证协议(干货分享)
更多 >
LV.0
百度后端高级工程师
目录
  • Spring 中的一些注解
    • @Component 和 @Bean 的区别是什么?
    • @Autowire 和 @Resource 的区别
    • 将一个类声明为 Spring 的 bean 的注解有哪些?
    • @Configuration :配置类注解
    • @ControllerAdvice :处理全局异常利器
    • @Component, @Repository, @Service 的区别
  • 总结
  • 参考链接
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档