Spring简介,或者如果整个项目是@Autowired和@Component,而您不了解它是什么,该怎么办

我问你,哈伯!

对于那些已经开始学习Java甚至设法在理解Java Core上取得一些成功的人来说,本文将是有用的,现在我听到了Spring一词。 而且,也许甚至没有一次:至少对于Spring框架的知识出现在许多空缺者的描述中。 本文将帮助您迈出第一步:了解这种流行框架的一般概念。

让我们从远处开始。 俄语中存在“控制反转”之类的东西-缩写形式的控制反转-IoC。 IoC是使我们的代码更接近宽松性的原则之一。 IoC是将我们职责的一部分委派给外部组件。

IoC方法有不同的实现方式,我们对其中之一感兴趣-依赖注入,依赖注入。 名称是什么,这说明了一切,因此,我将尝试通过一个示例进行披露。 我们正在编写一个使连锁商店的业务自动化的应用程序。 有商店(商店)和卖方(卖方)两类。 卖方类别具有商店类型的字段-卖方在其中工作的商店。 因此,我们面临着上瘾:卖方依赖商店。 现在让我们考虑一下Shop对象如何进入Seller对象? 有以下选项:

  • 通过设计师实施它,并在创建卖方时立即指定他工作的商店:

public class Seller { private Shop shop; public Seller(Shop shop) { this.shop = shop; } } 

  • 创建一个setter,并使用他的电话为卖方设置商店:

 public class Seller { private Shop shop; public void setShop(Shop shop) { this.shop = shop; } } 

列出的两种方法是依赖注入的实现。 最后,我们到了春天:它提供了注入依赖项的另一种方法。

一般来说,在很多情况下,Spring是种类繁多的库。 Spring MVC用于快速创建Web应用程序,Spring Security用于在应用程序中实现授权,Spring Data用于处理数据库等等。 但是Spring IoC独立存在-这是实现我们正在研究的主题的spring的基本类型-依赖注入。 由于其他原因,Spring IoC在研究Spring库的一开始就值得关注。 正如您将在使用其他类型的弹簧的实际工作过程中看到的那样,对于所有其他弹簧,Spring IoC被用作框架。

我们将以以下主要术语开始对Spring IoC的介绍:bean。 用最简单的话
Bean是Spring创建的类对象,可以作为字段值嵌入到另一个对象中。

您想要更复杂的单词吗? 并请:
bean是一个类对象,它是具有特定业务功能或内部Spring功能的完整程序元素,其生命周期由bin容器控制。

正如您已经了解的那样,为了使Shop能够实现Shop,Shop必须成为垃圾箱。 有几种方法可以告诉应用程序哪些对象拥有被称为bean的引以为傲的权利,所有这些方法都使我们引出了ApplicationContext的概念。 ApplicationContext是春天的心脏。 通常,它是在应用程序的开始(“上升”)创建的,并控制Bean的生命周期。 因此,它也称为垃圾箱。

我们正在走向主要。 我们如何需要重写我们的类,以便Spring IoC及其ApplicationContext仆人将Shop字段替换为Seller对象? 像这样:

 @Component public class Shop { } 

 @Component public class Seller { @Autowired private Shop shop; } 

简单吗? 容易得多! 优雅吗 挺好的 在这里发生了以下情况:Component注释告诉Spring,其注释的类是bin。 注解Autowired要求Spring在其注释的字段中替换一个值。 此操作称为注入。 确切的值将被替换? 我们稍后再讨论这一点,首先,我们将弄清楚类通常如何变成bean。

我们已经知道,在应用程序开始时,所有ApplicationContext bean的守护者必须上升。 他立即创建了所有垃圾箱。 几乎一切。 事实是,默认情况下,任何bean在值singleton中都具有intraspring属性范围。 Intraspringovoe,因为从字面意义上讲他不是单身。 这是spring的单例:引发上下文时,Spring将从指定的类中仅创建一个bin对象。 如果您想更改此行为-请使用Spring,您可以控制一个类的bean创建时间及其编号,但这与现在无关。

因此,当引发ApplicationContext时,将创建所有容器。 让我们确切地找到上下文在哪里,最重要的是:它如何确定从中创建垃圾箱的类。 为了简单起见,有几种选择,我们将讨论其中一种:使用xml文件进行配置。 这是一个例子:

 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:beans="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="product" class="main.java.Product"></bean> <context:component-scan base-package="main"/> </beans> 

该文件演示了如何以两种方式创建bean。 假设第一个是手动。 您会看到,有一个带有该类指示的Bean标签。 这是豆。 通过使用bean标记在此文件中注册的所有内容,将创建bean

第二种方式不太冗长。 记住,在这些类上,我们放置了Component批注。 在所有带有该注释的类中,将创建bean。 感谢xml文件中的这一行:

 <context:component-scan base-package="main"/> 

她告诉spring:扫描整个主程序包,然后从Component批注(或作为Component的其他批注)站立的所有内容中创建垃圾箱。 紧凑,不是吗? 我们只是说哪些包包含用于创建Bean的类,并注释这些类。

您可以使用带有以下代码行的xml文件来引发上下文:

 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); 

其中beans.xml是上述xml昵称的路径。

随着豆的创作弄清楚了。 创建卖方时,Spring如何填充“商店”字段? 引发上下文时,将创建Shop类的bin对象。 还创建了Seller类的bin对象;它也由Component注释。 它具有由Autowired注释的Shop类型。 自动装配注释告诉spring:您需要将垃圾箱注入该字段。 在我们的例子中,我们只有一个适合该角色的bin,即其类型与字段的类型匹配:这是bin-Shop类的实例。 它将根据需要注入到Seller对象中。 我了解到,现在的问题像蠕虫一样攀升:如果Spring没有找到所需的bean,或者找到了一些合适的bean(特别是考虑到您也可以通过接口而不是按类注入),将会发生什么。 Spring很聪明,但我们也需要这样做。 我们需要在系统中恰好有一个适合每个Autowired的bean,或者需要训练Spring在这种冲突中采取行动(我们现在不再谈论这个,您已经很累了,请自己收紧,这篇文章即将结束)。

请注意,卖方也是垃圾箱。 如果不是bin,而是通过new创建的,则不会自动注入。

也许现在您正在思考为什么所有这些困难都是必要的。 但是,假设我们的应用程序不是2类,而是大了几个数量级,并且依赖管理不再是最琐碎的任务。

也许现在您认为Spring使您能够实现美观,简单和简洁的依赖关系。 但是想象一下出了问题,您需要调试应用程序。 而且不再那么容易了...

最后,有几点提示:

  • 如果您已经实施了该项目,但是现在却迷失了如何从弹簧中取出垃圾箱进行查看,请执行以下操作:

 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); Seller seller = (Seller) context.getBean(Seller.class); 

这是获取垃圾桶的合法方法,尽管在现代现实中通常不会这样做。 但是对于案例研究,您可以。

  • 由于Spring是一个框架,因此您需要将其包含在项目中。 我使用maven创建一个应用程序,并将spring-core和spring-context依赖项添加到pom.xml文件。

Spring IoC包含创建,配置和注入Bean的巨大机会。 我们检查了冰山一角的一小部分,这是春季工作的一种方式,但我希望我们能够对它进行深入的了解,并对正在发生的事情有一个大致的了解。

Source: https://habr.com/ru/post/zh-CN455794/


All Articles