春天顶部

通过参考,使用Spring 5和Spring Boot 2开始学习春天课程:

>>学习春天

1.概述

在本教程中,我们将全面看看春天@成分注释和相关领域。到底,我们将看到不同的方式,我们可以使用它来与一些核心弹簧功能集成以及我们如何利用它的许多福利。

2.春天ApplicationContext.

在我们理解的价值之前@成分,我们必须先了解一下雷竞技app官网网站春天ApplicationContext.。这是Spring保存它已识别的对象的实例自动管理和分发。这些称为豆类。豆类管理和依赖注入的机会是Spring的主要功能中的一些。

使用控制原则的反转春天从我们的应用程序收集Bean实例,并在适当的时间使用它们。我们可以向Spring显示Bean依赖关系,而无需处理这些对象的设置和实例化。

能够使用注释@Autowired.将Spring Managed Bean注入我们的应用程序是在Spring中创建强大和可扩展的代码的驱动力。

那么,我们如何告诉春天我们希望它为我们管理豆类?雷竞技app官网网站我们应该通过在我们的课程上使用刻板印象注释来利用Spring的自动bean检测。

3.@成分

@成分是一个允许Spring自动检测我们的自定义豆的注释。

换句话说,无需编写任何显式代码,春季将:

  • 扫描我们对课程的申请@成分
  • 实例化它们并将任何指定的依赖项注入其中
  • 在需要的地方注射它们

但是,大多数开发人员更喜欢使用更专业的刻板印象注释来服务此功能。

3.1。Spring刻板印象注释

Spring提供了一些专门的刻板印象注释:@控制器@服务, 和@Repository.。它们都提供了与之相同的功能@成分它们都行动的原因是它们都是与之共同的诠释@成分作为每个人的元注释。他们就像@成分具有专门用途的别名和春季自动检测或依赖注入之外的含义。

如果我们真的想,我们可以理论上可以选择使用@成分专门用于我们的Bean自动检测需求。在侧面,我们也可以撰写自己的专业注释那用@成分。但是,还有其他春天的领域,专门用于春天的专业注释,以提供额外的自动化优势。所以我们可能只需坚持使用建立的专业化。

让我们假设我们在我们的Spring Boot项目中有一个例子:

@controller public类contracterxample {} @service public类serviceexample {} @repository public class repositoryexample {} @component公共类ComponentExample {} @target({ElementType.type})@Component公共@Interface自定义{} @customcomponent公共类自定义componentexample {}

我们可以写一个证明每个人被春天自动检测到的测试并添加到ApplicationContext.

@springboottest @extendwith(springextension.class)public class footsunittest {@autowired private applicationcontext applicationContext;@test public voidedinscopecoponents_whensearchinginapplicationscontext_thenfindthem(){assertnotnull(applicationscontext.getbean(contracterexample.class));assertnotnull(applicationcontext.getbean(serviceexample.class));assertnotnull(applicationcontext.getBean(RepositoryExample.class));assertnotnull(applicationcontext.getBean(ComponentExample.class));assertnotnull(applicationcontext.getBean(自定义键入申请表);}}

3.2。@ComponentsCan.

在我们完全依赖之前@成分,我们必须明白,它本身就是一个普通的注释。注释服务于将Bean与其他对象(例如域对象)差异化。然而,春天使用了@ComponentsCan.诠释实际收集它们的全部ApplicationContext.

如果我们正在编写一个春天启动应用程序,就会知道这一点是有帮助的@springbootapplication是一个组成的注释,包括@ComponentsCan.。只要我们的@springbootapplication班级是我们项目的根目录,它将扫描每一个@成分我们默认定义。

但是,在我们的情况下@springbootapplication课程不能处于我们项目的根源,或者我们想扫描外部来源,我们可以配置@ComponentsCan.只要在类路径上存在,明确地查看我们指定的任何包。

让我们定义一个范围@成分豆角,扁豆:

包com.baeldun雷竞技app下载官方版isog.component.scannedscope;@component公共类扫描扫描opeexample {}

接下来,我们可以通过明确的指示将其包含给我们的@ComponentsCan.注解:

包com.baeldun雷竞技app下载官方版isog.component.inscope;@springbootapplication @componentscan({com.b雷竞技app下载官方版isoaeldung.component.inscope“,”com.baeldung.component.scannedscope“})公共类ComponentApplication {//公共静态void main(String [] args){...}}

最后,我们可以测试它存在:

@test public vioid givenscannedscopecoponent_whensearchinginapplicationscontext_thenfindit(){assertnotnull(applicationscontext.getbean(scannedscopeexample.class));}

实际上,当我们想扫描我们项目中包含的外部依赖项时,这更有可能发生。

3.3。@成分限制

我们希望某些物体在无法使用时希望某个对象成为弹簧管理的豆类@成分

例如,让我们定义带有注释的对象@成分在我们项目之外的一个包中:

包com.baeldun雷竞技app下载官方版isog.component.outsidescope;@component公共类Outsidescopeexample {}

这是一个证明这一点的测试ApplicationContext.不包括外部组件:

@test public voidedoutsidescopecomponent_whensearchinginapplicationscontext_thenfail(){assertthrows(nosuchbeandefinitionexception.class,() - > applicationcontext.getbean(outsideScopeexample.class));}

此外,我们可能无法访问源代码,因为它来自第三方来源,我们无法添加@成分注解。或者我们希望根据我们运行的环境,有条件地使用一个bean实现。自动检测大部分时间都足够了,但是当它不是时,我们可以使用@豆角,扁豆

4.@成分vs.@豆角,扁豆

@豆角,扁豆也是春天用于在运行时收集豆类的注释,但它不在类级别使用。相反,我们注释了方法@豆角,扁豆因此,春天可以将方法的结果存储为春季bean。

要查看它是如何工作的示例,让我们首先创建一个没有注释的pojo:

公共类beanexample {}

我们班级的内部注释@配置,我们可以创建Bean生成方法:

@bean public beanexample beanexample(){return new beanexample();}

豆豆表可能代表本地类,也可能是外部类。这没关系,因为我们只需要返回它的实例。

然后我们可以编写一个验证春天的测试确实拿起了bean:

@test public voidedbeancomponent_whensearchinginpplicationscontext_thenfindit(){assertnotnull(applicationcontext.getbean(beanexample.class));}

由于差异,我们应该注意一些重要的含义@成分@豆角,扁豆

  • @成分是一个类级注释,但是@豆角,扁豆是在方法级别,所以@成分只有当类的源代码是可编辑的时,只是一个选项。@豆角,扁豆总是可以使用,但它更详细。
  • @成分与Spring的自动检测兼容,但是@豆角,扁豆需要手动类实例化。
  • 使用@豆角,扁豆将Bean的实例化与其类定义分离。这就是为什么我们可以使用它来使第三方课程成为春豆。它还意味着我们可以介绍逻辑来决定要使用的bean的几个可能的实例选项中的哪一个。

结论

我们刚刚探索了春天@成分注释以及其他相关主题。首先,我们讨论了各种弹簧刻板印象注释,这只是专门的版本@成分。然后我们了解到了@成分除非可以找到它,否则不会做任何事情@ComponentsCan.。最后,因为不可能使用@成分在课程中,我们没有源代码,我们学会了如何使用@豆角,扁豆注释代替。

所有这些代码示例还可以在github上

弹簧底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

>>课程
评论在本文上关闭!