我还没有找到我能理解的 Spring bean 的高级定义。我在 Grails 文档和书籍中经常看到它们被引用,但我认为了解它们是什么会很有帮助。那么什么是Spring bean?如何使用它们?它们与依赖注入有关吗?
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 定义为部署在多个范围之一中。
Spring bean 只是由 Spring 容器管理的实例对象,即它们由框架创建和连接,并放入“对象包”(容器)中,以后可以从中获取它们。
“接线”部分是依赖注入的全部内容,这意味着您可以说“我需要这个东西”,框架将遵循一些规则来为您提供正确的实例。
对于不习惯 Spring 的人,我认为 Wikipedia Spring's article has a nice description:
Spring 框架的核心是它的控制容器反转,它提供了一种使用反射配置和管理 Java 对象的一致方法。容器负责管理特定对象的对象生命周期:创建这些对象,调用它们的初始化方法,并通过将它们连接在一起来配置这些对象。由容器创建的对象也称为托管对象或 bean。可以通过加载 XML 文件或检测配置类上的特定 Java 注释来配置容器。这些数据源包含提供创建 bean 所需信息的 bean 定义。可以通过依赖查找或依赖注入来获取对象。依赖查找是调用者向容器对象询问具有特定名称或特定类型的对象的模式。依赖注入是一种模式,其中容器通过构造函数、属性或工厂方法按名称将对象传递给其他对象。
首先让我们了解一下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
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.
实在是太荒谬了。
好吧,你部分理解了。您必须根据需要定制 bean,并通知 Spring 容器在需要时对其进行管理,方法是使用由 Martin Fowler 创造的流行称为 IoC (Inversion of Control) 的方法,也称为 Dependency Injection (DI)。
您以某种方式连接 bean,这样您就不必处理实例化或评估对 bean 的任何依赖关系。这通常称为 Hollywood Principle。
除了在这个问题中你会被淹没的链接之外,谷歌是探索更多这方面的最佳工具。 :)
一个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。
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
Spring bean 只是由 Spring IOC 容器管理的对象实例。
Spring IOC 容器承载着 Bean 的 Bag。Bean 的创建、维护和删除是 Spring Container 的职责。
我们可以通过 Wiring 和 Auto Wiring 将 bean 放入 Spring。
接线意味着我们手动将其配置到 XML 文件中。
Auto Wiring 是指我们将注解放入 Java 文件中,然后 Spring 会自动扫描 java 配置文件所在的根上下文,并将其放入 Spring 的包中。
Spring bean 是类。您无需实例化一个类(使用 new
),而是从应用程序上下文中将实例作为 bean
强制转换为您的类类型,其中 bean 是您在应用程序上下文配置中配置的。这样,整个应用程序在整个应用程序中维护单例范围的实例。在应用程序上下文被实例化后,所有 bean 都按照它们的配置顺序进行初始化。即使您在应用程序中没有获得任何 bean,所有 bean 实例也已在您创建应用程序上下文之后创建。
就 Spring 启动应用程序而言,bean 只是一个 Java 对象,由 Spring 框架在应用程序启动时创建。
对象的用途几乎可以是任何东西——配置、服务、数据库连接工厂等——Spring 并不关心。
大多数 bean 依赖于其他 bean 才能工作,例如,实体管理器可能需要数据库连接。 Spring 框架能够弄清楚 bean 应该如何自动连接在一起。从您的应用程序开发人员的角度来看,您只需要声明您需要的 bean,它们就会“神奇地”出现在您的应用程序中以供使用。
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();
}
}
在 Spring 中,那些构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。 bean 只是一个由 Spring IoC 容器实例化、组装和以其他方式管理的对象;
对于 Spring,所有对象都是 bean! Spring 框架中的基本步骤是将对象定义为 bean。 Bean 只不过是 Spring 框架通过查看它们的类定义来创建的对象实例。这些定义基本上形成了配置元数据。然后,框架根据此配置元数据创建一个需要实例化对象、需要设置和注入哪些依赖项、新创建实例的范围等的计划。元数据可以在一个简单的 XML 文件中提供,就像在第一章中一样。或者,可以将元数据作为注释或 Java 配置提供。
书:只是春天
不定期副业成功案例分享
@Autowired
的时候吗?或者只是当我做我的import
时?