SpringBoot系列之注解@Component VS @Bean(四)

前言

通过前面几节内容得知,我们一直遗漏了注解@Component,本节我们来讨论下注解@Component以及它和注解@Bean的区别所在。

@Component VS @Bean

 在讲解注解@Component之前,在Spring中有这样一个包【org.springframework.stereotype package.】我们称之为Stereotype annotations(构造型注解),首先我们需要知道构造型注解的概念是什么,我们直接从该单词所代表的含义入手,详见解释【https://www.merriam-webster.com/dictionary/stereotype】:符合固定或一般模式的事物; 特别是:小组成员共同拥有的标准化的心理图景,代表过分简化的观点,偏见或不加批判的判断。大致意思就是个人主观臆断和团队共同一致的观点,在实际生活中我们绝大多数人都会基于某个人的行为特征进行判断,显然这不是好的行为习惯,但在Spring中应用了此判断,相当于指定了这样一个标准,在程序开发中专用名词为【约定】,我们知道在Spring MVC中,控制器(Controller)在MVC模式中的作用是控制路由请求,服务(Service)是我们可以放置所有业务逻辑的地方,最后,我们知道仓储(Repository)是我们实现各种持久性存储的数据访问层的地方,根据类在应用程序中的作用对其进行分类至关重要。所以这才有了在上述给出的构造型包中所存在的注解@Controller、@Service和@Repository。注解@Component位于控制器、服务、仓储的顶级,它是任何Spring托管组件的通用构造型注解,这也就意味着,如果要在应用程序上下文中注册类,我们可以使用@Component注解进行注册,而其他构造型(Controller,Service,Repository)只是@Component类的特例,如果我们查看它们的源代码,就会看到它们本身带有@Component注解,如下图所示。那么为什么我们不就用@Component注解所有内容呢?它可以帮助开发人员对特定类进行分类,我们可以查看带有@Controller注解的类,并立即了解其用途。

如果我们使用注解@Component或其他构造型注解之一标记一个类,则将使用类路径扫描自动检测这些类,并为每个这些类创建一个新bean。 

package com.demo.springboot;

import org.springframework.stereotype.Controller;

@Controller
public class HomeController {

    public String home(){
        return "Hello, World!";
    }
}

在如上带注解@Controller的类和Bean之间存在隐式的一对一映射(即每个类一个Bean),我们需要注意的是:构造型注解是类级别的注解。注解@Bean用于显式声明单个bean,而不是像我们使用@Controller那样让Spring自动执行检测,它使Bean的声明与类定义完全脱钩,使我们可以完全按照自己的选择创建和配置Bean, 使用注解@Bean时,我们不能将此注解放在类级别,如果我们尝试这样做,则会收到如下无效的类型错误。Spring官方将其定义为:指示方法产生一个由Spring容器管理的bean。通常情况下,@ Bean方法在@Configuration类中声明,这点在之前内容已经讨论过。

到此关于注解@Component已讲解完毕,我们依然对注解@Component和@Bean下一个结论:@Component是一个通用注解,可以应用于应用程序的任何类,以使其成为Spring托管组件(简单来说,是任何Spring托管组件的通用构造型)。当通过spring的注解@ComponentScan功能扫描类路径时,它将识别用@Component注释注释的类(在给定的包内),并创建此类的Bean,并将其注册到ApplicationContext中,注解@Component是一个类级别的注解,其目的是使该类成为Spring托管组件和用于类路径扫描功能的可自动检测到的bean。而注解@Bean用于在方法返回的Spring IOC容器中显式声明和注册一个Bean(作为配置Bean),由于@Bean是方法级别的注解,所以不能与类和对象声明一起使用,它在用@Configuration注解的类中使用,简单来说,注解@Bean用于将方法返回的bean注册为IOC Container中的spring配置bean,@Bean注解指示方法产生应由Spring容器管理的bean,要声明一个bean,只需使用@Bean对方法进行注解, 当Spring检测到该注解方法时,它将执行该方法并将返回值注册为ApplicationContext中的Bean, 默认情况下,bean名称与方法名称相同。

总结

本节我们叙述了注解@Component是什么,同时对比了注解@Component和@Bean的区别所在,好了,本文我到此为止,感谢您的阅读,我们下节见。

posted @ 2020-01-05 22:09  Jeffcky  阅读(7291)  评论(0编辑  收藏  举报