四季豆到底是什么?


397

我还没有找到我能理解的高级Spring bean定义。我看到Grails文档和书籍中经常引用它们,但是我认为了解它们的好处将是有益的。那么什么是春豆呢?如何使用它们?他们和依赖注入有关系吗?


2
Grails建立在Spring之上。如果您不熟悉Spring,建议您至少阅读一些有关Spring的材料,以便您了解正在使用的技术。
Jeff Storey 2013年

26
我认为这里的评论也遇到了OP在Grails文档和书籍中的参考文献中看到的相同问题:它们仅对已经知道其含义的人来说容易。我发现Wikipedia的文章对初学者更好地描述了它。
Elias Dorneles

12
@MarcoForberg之所以认为Spring的古代版本在Google上受到好评是原因之一,是因为人们不断从诸如SO之类的地方进行链接…… static.springsource.org/spring/docs/3.2.x/ … 会更好。这些天开始的地方。
伊恩·罗伯茨

5
+1 @IanRoberts。这是当前的
dmahapatro

他们通过说IoC也称为DI来引入IoC并没有帮助。它们是相关的,但是IoC范围更广。
阿兰·哈达德

Answers:


212

构成应用程序主干并由Spring IoC *容器管理的对象称为bean。Bean是由Spring IoC容器实例化,组装和以其他方式管理的对象。这些bean是使用您提供给容器的配置元数据创建的,例如,以XML <bean/>定义的形式。

SpringSource了解更多有关bean和作用域的信息:

当您创建bean定义时,您实际创建的是创建该bean定义所定义的类的实际实例的方法。bean定义是配方的想法很重要,因为它意味着像一个类一样,您可能从一个配方中创建了许多对象实例。

您不仅可以控制要插入到从特定bean定义创建的对象中的各种依赖项和配置值,还可以控制从特定bean定义创建的对象的范围。这种方法非常强大,可让您灵活地选择通过配置创建的对象的范围,而不必在Java类级别上“接受”对象的范围。可以将Bean定义为部署在多个范围之一中

* IoC:控制反转


10
因此,这些是容器管理的对象,我不必接触,但是如果我想访问bean来调用某些方法或检索属性,那么我可以向bean询问Spring吗?
Grantmcconnaughey 2013年

22
@grantmc类似于这样,除了应该将控制事物的反转理解为与“询问”相反:您无需声明“要”,而是“声明”您将需要它。然后,在启动应用程序时,框架将检查所有声明并设置适当的实例。
Elias Dorneles

6
@elias如何声明我需要它?使用时是@Autowired吗?还是干脆当我做我import的?
Mikhail Batcer

16
定义IoC对Spring新手来说意味着什么。
卢卡斯

4
@lucas同意。IoC是“控制反转”。参见出色的问答:Spring Framework中的依赖注入和控制反转是什么?什么是控制反转?
mhradek '17

135

Spring bean只是由Spring容器管理的实例对象,即,它们是由框架创建和连接的,并放入“对象袋”(容器)中,您可以从那里稍后获取它们。

“接线”部分就是依赖注入的全部含义,这意味着您可以说“我将需要这个东西”,并且框架将遵循一些规则来为您提供适当的实例。

对于不习惯使用Spring的人,我认为Wikipedia Spring的文章有一个很好的描述

Spring框架的核心是控制容器的倒置,它提供了使用反射配置和管理Java对象的一致方法。容器负责管理特定对象的对象生命周期:创建这些对象,调用其初始化方法以及通过将它们连接在一起来配置这些对象。

容器创建的对象也称为托管对象bean。可以通过加载XML文件或检测配置类上的特定Java注释来配置容器。这些数据源包含Bean定义,这些定义提供了创建Bean所需的信息。

可以通过依赖关系查找依赖关系注入来获取对象。依赖关系查找是一种模式,在此模式下,调用者向容器对象询问具有特定名称或特定类型的对象。依赖注入是一种模式,其中容器通过构造函数,属性或工厂方法将名称按名称传递给其他对象。


实例只是对象的另一个词。当您使用“对象实例”时,您不是在说对象吗?
乌冬之焰

有趣的问题。根据Wikipedia的说法,我应该说“实例对象”:en.wikipedia.org/wiki/Instance_
computer_science

2
兔子洞越来越深。
乌冬之焰

今天我意识到,“对象对象”(以及对象实例)对我而言实际上是有意义的,因为我习惯于类也是对象的语言(因此,您拥有类对象,以及“对象”对象) )。无论如何,根据Wikipedia的文章,我已经更新了描述以使用“实例对象”。^^
Elias Dorneles

1
@Ruizhi一个常规的对象,即一个类的实例-此讨论是关于使用正确的表达式引用一个对象的旁听。:)
Elias Dorneles

50

首先让我们了解一下Spring:

Spring是一个轻量级且灵活的框架。

比喻:
在此处输入图片说明

Bean:是一个对象,在Spring容器中创建,管理和销毁。我们可以通过元数据(xml或注释)将对象注入到Spring容器中,这称为控制反转。

打个比方: 让我们假设农民有一块以种子(或豆类)耕种的农田。在这里,农民是Spring框架,农田是Spring容器,Bean是Spring Bean,耕种是Spring Processors。

在此处输入图片说明

像bean的生命周期一样,spring bean也有它自己的生命周期。

在此处输入图片说明

在此处输入图片说明

img来源

以下是Spring中的bean生命周期序列:

  • 实例化:首先,spring容器从XML文件中找到bean的定义并实例化bean。

  • 填充属性:使用依赖项注入,spring填充bean定义中指定的所有属性。

  • 设置Bean名称:如果Bean实现BeanNameAware接口,则spring将Bean的ID传递给setBeanName()方法。

  • 设置Bean工厂:如果Bean实现BeanFactoryAware接口,则spring将beanfactory传递给setBeanFactory()method。

  • 预初始化:也称为bean的后处理。如果有任何与该Bean相关联的Bean BeanPostProcessors,Spring会调用该postProcesserBeforeInitialization()方法。

  • 初始化bean:如果bean实现IntializingBeanafterPropertySet()则调用其方法。如果bean具有init方法声明,则调用指定的初始化方法。

  • 初始化后:–如果BeanPostProcessors与bean相关联,postProcessAfterInitialization()则将调用其方法。

  • 准备使用:现在该bean已可以由应用程序使用

  • 销毁:如果bean实现DisposableBean,它将调用destroy()方法


23

好吧,您对此有所了解。您必须根据需要定制bean,并通过使用Martin Fowler创造的,通常称为IoC(控制反转)的方法(也称为依赖注入(DI))来通知Spring容器以在需要时进行管理。

您以某种方式连接Bean,这样您就不必担心实例化或评估对Bean的任何依赖关系。这就是俗称的好莱坞原则

除了您在此问题中可能会泛滥的链接之外,Google还是探索此事的最佳工具。:)


2
不能指出IoC是概念,而DI是可用于实现IoC的技术(之一),它们不是可替代的定义。
kekko12


8

春豆是类。无需实例化类(使用new),而是bean从应用程序上下文获得实例作为对类类型的强制转换,其中Bean是您在应用程序上下文配置中配置的。这样,整个应用程序将在整个应用程序中维护单例作用域实例。在实例化应用程序上下文之后,立即按照其配置顺序初始化所有bean。即使您的应用程序中未包含任何bean,在创建应用程序上下文后即刻已经创建了所有bean实例。


1
Bean 不是类,而是作为容器实例实现的类实例的对象。
Chatatata,

7
  • Spring bean只是由Spring IOC容器管理的对象实例。

  • Spring IOC容器带有Bean袋。Bean的创建,维护和删除是Spring Container的职责。

  • 我们可以通过接线和自动接线将bean放入Spring。

  • 接线意味着我们将其手动配置到XML文件中。

  • Auto Wiring意味着我们将批注放入Java文件中,然后Spring自动扫描Java配置文件所在的根上下文,将其放入Spring包中。


7

Bean是POJO(普通Java对象),由spring容器管理。

Spring容器默认只创建一个bean实例。该bean被缓存在内存中,因此对该bean的所有请求都将返回对同一bean的共享引用。

@Bean批注返回一个对象,该对象在应用程序上下文中作为一个bean注册。方法内部的逻辑负责创建实例。

什么时候使用@Bean批注?

如果无法进行自动配置。例如,当我们要从第三方库连接组件时,由于源代码不可用,因此我们无法使用@Component注释类。

实时场景可能是某人想要连接到Amazon S3存储桶。因为源不可用,所以他必须创建一个@bean。

@Bean
public AmazonS3 awsS3Client() {
    BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
    return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
            .withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}

上面代码的来源-> https://www.devglan.com/spring-mvc/aws-s3-java

因为我在上面提到了@Component Annotation。

@Component表示带注释的类是“组件”。使用基于注释的配置和类路径扫描时,此类会被视为自动检测的候选。

组件注释将类注册为单个bean。


2

在Spring中,那些构成应用程序主干并由Spring IoC容器管理的对象称为Bean。Bean只是一个对象,该对象由Spring IoC容器实例化,组装和管理。


1

对于Spring,所有对象都是bean!Spring Framework的基本步骤是将对象定义为bean。Bean就是对象实例,它是Spring框架通过查看其类定义而创建的。这些定义基本上构成了配置元数据。然后,框架根据此配置元数据创建一个计划,针对该计划需要实例化对象,需要设置和注入哪些依赖项,新创建的实例的范围等。

就像在第一章中一样,元数据可以以简单的XML文件提供。或者,可以将元数据提供为注释或Java配置。

图书:《刚好春天》


1

Spring的XML配置由Bean组成,并且Bean基本上是类。它们只是我们在ApplicationContext内部使用的POJO。可以将定义Bean视为替换关键字new。因此,无论您在应用程序中使用关键字new的什么地方,都类似:

MyRepository myRepository =new MyRepository ();

在使用关键字new的地方,您可以查看删除该配置并将其放入XML文件中。因此,我们将这样编写代码:

<bean name="myRepository " 
      class="com.demo.repository.MyRepository " />

现在我们可以简单地使用Setter注入/构造函数注入。我正在使用Setter注入。

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.