ChatGPT解决这个技术问题 Extra ChatGPT

春豆到底是什么?

我还没有找到我能理解的 Spring bean 的高级定义。我在 Grails 文档和书籍中经常看到它们被引用,但我认为了解它们是什么会很有帮助。那么什么是Spring bean?如何使用它们?它们与依赖注入有关吗?

Grails 建立在 Spring 之上。如果您不熟悉 Spring,我建议您至少阅读一些有关它的资料,以便了解您正在使用的技术。
我认为这里的评论遇到了 OP 在 Grails 文档和书籍的参考资料中看到的相同问题:它们只对已经知道它们的意思的人来说很容易。我发现维基百科的文章对初学者的描述要好得多。
@MarcoForberg 古代版本的 Spring 在 Google 上最受欢迎的原因之一是人们不断从 SO 之类的地方链接到它... static.springsource.org/spring/docs/3.2.x/… 这些天将是一个更好的起点。
+1 @伊恩罗伯茨。这是current one
他们通过说 IoC 也称为 DI 来介绍 IoC 并没有帮助。它们是相关的,是的,但 IoC 更广泛。

M
M. Justin

Spring 核心技术 reference documentation 描述了 bean 是什么。

根据 Introduction to the Spring IoC Container and Beans 部分(其中“IoC”表示“inversion of control”):

在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 是由 Spring IoC 容器实例化、组装和管理的对象。否则,bean 只是应用程序中的众多对象之一。 Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。

Bean 和范围在 Bean Scopes 部分中进行了描述:

当您创建一个 bean 定义时,您创建了一个用于创建由该 bean 定义定义的类的实际实例的方法。 bean 定义是一个配方的想法很重要,因为这意味着,与一个类一样,您可以从一个配方创建许多对象实例。您不仅可以控制要插入到从特定 bean 定义创建的对象中的各种依赖项和配置值,还可以控制从特定 bean 定义创建的对象的范围。这种方法功能强大且灵活,因为您可以通过配置选择您创建的对象的范围,而不必在 Java 类级别烘焙对象的范围。可以将 Bean 定义为部署在多个范围之一中。


所以这些是容器管理的对象,我不必接触,但如果我想访问一个 bean 以调用一些方法或检索属性,那么我可以“向”Spring 请求 bean 吗?
@grantmc 有点像,除了控制反转的事情应该被理解为与“询问”相反:而不是“询问”事物,而是“声明”你需要它。然后,当您启动应用程序时,框架将检查所有声明并设置适当的实例。
@elias 我如何声明我需要它?是在我使用 @Autowired 的时候吗?或者只是当我做我的import时?
定义 IoC 对 Spring 新手的意义会很有帮助。
@lucas 同意。 IoC 是“控制反转”。请参阅出色的问答:What is Dependency Injection and Inversion of Control in Spring Framework?What is Inversion of Control?
E
Elias Dorneles

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

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

对于不习惯 Spring 的人,我认为 Wikipedia Spring's article has a nice description

Spring 框架的核心是它的控制容器反转,它提供了一种使用反射配置和管理 Java 对象的一致方法。容器负责管理特定对象的对象生命周期:创建这些对象,调用它们的初始化方法,并通过将它们连接在一起来配置这些对象。由容器创建的对象也称为托管对象或 bean。可以通过加载 XML 文件或检测配置类上的特定 Java 注释来配置容器。这些数据源包含提供创建 bean 所需信息的 bean 定义。可以通过依赖查找或依赖注入来获取对象。依赖查找是调用者向容器对象询问具有特定名称或特定类型的对象的模式。依赖注入是一种模式,其中容器通过构造函数、属性或工厂方法按名称将对象传递给其他对象。


实例只是对象的另一种说法。当您使用“对象实例”时,您不是在说对象对象吗?
有趣的问题。根据维基百科,我应该说“实例对象”:en.wikipedia.org/wiki/Instance_(computer_science)
兔子洞越来越深。
我今天意识到“对象对象”(以及因此对象实例)对我来说实际上是有意义的,因为我习惯于类也是对象的语言(所以你有类对象,以及“对象”对象)。无论如何,我已经根据 Wikipedia 文章更新了描述以使用“实例对象”。 ^^
@Ruizhi 一个常规对象,即一个类的一个实例——这个讨论是关于使用正确的表达式来引用一个对象的一个分支。 :)
P
Premraj

首先让我们了解一下Spring:

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

https://i.stack.imgur.com/UXWKb.jpg

Java Beans 是将许多对象封装到单个对象(bean)中的类。 “Bean”这个名称是为了包含这个标准,它旨在为 Java 创建可重用的软件组件。

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

类比:让我们假设农民正在用种子(或豆类)耕种农田。这里,Farmer 是 Spring Framework,Farmland land 是 Spring Container,Beans 是 Spring Beans,Cultivating 是 Spring Processors。

https://i.stack.imgur.com/UugO2.jpg

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

https://i.stack.imgur.com/kpxyA.jpg

https://i.stack.imgur.com/TDLCr.png

img source

Following is sequence of a bean lifecycle in Spring:

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

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

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

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

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

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

Post-Initialization: – 如果有任何 BeanPostProcessor 与 bean 关联,它们的 postProcessAfterInitialization() 方法将被调用。

Ready to use:现在 bean 可以被应用程序使用了

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


很抱歉,说 Spring is a lightweight [...] framework. 实在是太荒谬了。
@avf 嗯,我不是专家,但我多次听说 Spring 是一个轻量级框架,并且我在很多地方都读过它。但正如我所说,我没有太多的知识。你能分享一些关于你如何知道它不是的信息吗?所以我可以知道它是否轻量级。谢谢你。
d
dmahapatro

好吧,你部分理解了。您必须根据需要定制 bean,并通知 Spring 容器在需要时对其进行管理,方法是使用由 Martin Fowler 创造的流行称为 IoC (Inversion of Control) 的方法,也称为 Dependency Injection (DI)。

您以某种方式连接 bean,这样您就不必处理实例化或评估对 bean 的任何依赖关系。这通常称为 Hollywood Principle

除了在这个问题中你会被淹没的链接之外,谷歌是探索更多这方面的最佳工具。 :)


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

一个Bean是一个POJO(Plain Old Java Object),由spring容器管理。

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

@Bean 注解返回一个在应用上下文中 spring 注册为 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 注解。

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

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


Y
Yasir Shabbir Choudhary

Spring 有携带 Bag of Bean 的 IoC 容器;创建维护和删除是 Spring Container 的职责。我们可以通过 Wiring 和 Auto Wiring 将 bean 放入 Spring。 Wiring 意味着我们手动将其配置到 XML 文件中,“Auto Wiring”意味着我们将注解放入 Java 文件中,然后 Spring 会自动扫描 java 配置文件所在的 root-context,并将其放入 Spring 的包中。

Here is the detail URI where you got more information about Beans


m
maniBrock

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

Spring IOC 容器承载着 Bean 的 Bag。Bean 的创建、维护和删除是 Spring Container 的职责。

我们可以通过 Wiring 和 Auto Wiring 将 bean 放入 Spring。

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

Auto Wiring 是指我们将注解放入 Java 文件中,然后 Spring 会自动扫描 java 配置文件所在的根上下文,并将其放入 Spring 的包中。


P
Pang

Spring bean 是类。您无需实例化一个类(使用 new),而是从应用程序上下文中将实例作为 bean 强制转换为您的类类型,其中 bean 是您在应用程序上下文配置中配置的。这样,整个应用程序在整个应用程序中维护单例范围的实例。在应用程序上下文被实例化后,所有 bean 都按照它们的配置顺序进行初始化。即使您在应用程序中没有获得任何 bean,所有 bean 实例也已在您创建应用程序上下文之后创建。


Bean 不是类,而是作为类实例的对象,由容器实现管理。
这让我对豆类有了更好的了解。所以基本上它是在不使用著名的“new”关键字的情况下实例化一个类。谢谢你。
j
jurez

就 Spring 启动应用程序而言,bean 只是一个 Java 对象,由 Spring 框架在应用程序启动时创建。

对象的用途几乎可以是任何东西——配置、服务、数据库连接工厂等——Spring 并不关心。

大多数 bean 依赖于其他 bean 才能工作,例如,实体管理器可能需要数据库连接。 Spring 框架能够弄清楚 bean 应该如何自动连接在一起。从您的应用程序开发人员的角度来看,您只需要声明您需要的 bean,它们就会“神奇地”出现在您的应用程序中以供使用。


M
Muhammad Waqas Dilawar

Spring 的 XML 配置由 Bean 组成,而 Bean 基本上是类。它们只是我们在 ApplicationContext 中使用的 POJO。定义 Bean 可以被认为是替换关键字 new。因此,无论您在应用程序中使用什么关键字 new,例如:

MyRepository myRepository =new MyRepository ();

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

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

现在我们可以简单地使用 Setter Injection/Constructor Injection。我正在使用 Setter 注入。

public class MyServiceImpl implements MyService {
    private MyRepository myRepository;
    public void setMyRepository(MyRepository myRepository)
        {
    this.myRepository = myRepository ;
        }
public List<Customer> findAll() {
        return myRepository.findAll();
    }
}

u
user3472473

在 Spring 中,那些构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 只是一个由 Spring IoC 容器实例化、组装和以其他方式管理的对象;


C
Community

对于 Spring,所有对象都是 bean! Spring 框架中的基本步骤是将对象定义为 bean。 Bean 只不过是 Spring 框架通过查看它们的类定义来创建的对象实例。这些定义基本上形成了配置元数据。然后,框架根据此配置元数据创建一个需要实例化对象、需要设置和注入哪些依赖项、新创建实例的范围等的计划。元数据可以在一个简单的 XML 文件中提供,就像在第一章中一样。或者,可以将元数据作为注释或 Java 配置提供。

书:只是春天