春豆到底是什么?

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

209766 次浏览

Spring核心技术参考文档描述了bean是什么。

根据Spring IoC容器和bean介绍部分(其中"IoC"意味着“控制反转"):

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

bean和作用域在豆范围部分中描述:

在创建bean定义时,您创建了用于创建由该bean定义定义的类的实际实例的配方。bean定义是一个配方的想法很重要,因为这意味着,与类一样,您可以从一个配方创建许多对象实例。

您不仅可以控制将插入到从特定bean定义创建的对象中的各种依赖项和配置值,还可以控制从特定bean定义创建的对象的范围。这种方法功能强大且灵活,因为您可以选择通过配置创建的对象的作用域,而不必在Java类级别上烘烤对象的作用域。可以将bean定义为部署在多个作用域中的一个中。

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

“连接”部分是依赖注入的全部内容,它的意思是你可以说“我将需要这个东西”,框架将遵循一些规则来为你获得适当的实例。

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

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

你只理解了一部分。您必须根据需要定制bean,并通知Spring容器在需要时管理它,方法是使用由马丁创造的通常称为IoC (控制反转)的方法,也称为依赖注入 (DI)。

您以某种方式连接bean,这样您就不必关心实例化或计算bean上的任何依赖项。这通常被称为好莱坞原则

谷歌是最好的工具,除了在这个问题中你会被淹没的链接之外,还可以探索更多关于这个问题的内容。:)

在Spring中,那些构成应用程序主干并由Spring IoC管理的对象 容器被称为bean。bean只是一个实例化、组装等的对象 由Spring IoC容器管理;< / p >

Spring有IoC容器,里面装着一袋豆子;创建、维护和删除是Spring Container的职责。 我们可以通过布线和自动布线将bean放到Spring中。 布线意味着我们手动将其配置到XML文件中,“自动布线”意味着我们将注释放入Java文件中,然后Spring自动扫描Java配置文件所在的根上下文,将其制作并放入Spring的包中

这是详细的URI,您可以在其中获得有关Beans的更多信息

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

  • 春季IOC容器携带袋豆。Bean的创建、维护和删除是Spring Container的职责。

  • 我们可以通过布线和自动布线将bean放到Spring中。

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

  • 自动布线意味着我们把注释放在Java文件中,然后Spring自动扫描Java配置文件所在的根上下文,使其放入Spring的包中。

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

对于Spring,所有对象都是bean !Spring Framework的基本步骤是将对象定义为bean。bean只不过是spring框架通过查看类定义创建的对象实例。这些定义基本上构成了配置元数据。然后,框架根据这个配置元数据创建一个计划,其中包括需要实例化哪些对象、需要设置和注入哪些依赖关系、新创建实例的范围等等。

元数据可以在一个简单的XML文件中提供,就像第一章中那样。或者,可以将元数据作为Annotation或Java Configuration提供。

书:Just Spring

首先让我们来了解一下春天:

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

< p > 类比:
enter image description here < / p >

<强> Java bean < / >强是将许多对象封装到单个对象(bean)中的类。名字&;"该标准旨在为Java创建可重用的软件组件。

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

< >强劲的类比: 让我们假设农民有一块种种子(或豆子)的农田。 在这里,农民是春天的框架,农田是春天的容器,豆子是春天的豆子,耕种是春天的加工者

enter image description here

和豆类的生命周期一样,春豆也有自己的生命周期。

enter image description here

enter image description here

img source

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

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

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

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

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

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

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

  • 后初始化:-如果有任何与bean关联的BeanPostProcessors,它们的postProcessAfterInitialization()方法将被调用。

  • 准备使用:现在应用程序已经可以使用bean了

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

Spring的XML配置由bean组成,而bean基本上是类。它们只是我们在ApplicationContext中使用的pojo。定义bean可以看作是替换关键字new。所以无论你在应用程序中使用关键字new,比如:

MyRepository myRepository =new MyRepository ();
当你使用关键字时,你可以删除该配置并将其放入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();
}
}

Bean是一个POJO(普通旧Java对象),由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 Annotation。

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

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

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

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

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

对于一个可用作Java bean的Java类,它的setter和getter方法名称需要应符合属性的JavaBean指导方针(也称为设计模式)。如果这样的Java类是可实例化的&由Spring IoC容器管理,它是一个Spring bean。为了实现这一点,程序员通过使用XML配置文件或注释或两者的混合,将类电线作为合适的范围的bean定义。程序员可以从现有的Spring bean中创建新的Spring bean,方法是将后者作为<idref>元素的字符串名称传递给前者的构造函数参数,或者通过依赖项注入(它可以是递归的)来进一步连接。

这个答案可以结合我的 SO答案来阅读,以获得更多的背景信息。

bean是由Spring容器管理的类的实例