Spring容器及Bean的创建过程

        前言: 本人最近在面试的时候,被问到spring的时候,一是感觉到有些部分有些生疏了,二是在回答的过程中,也许我自己脑子是清晰的,但自己并没有很好的表达出来,因此根据自己之前零散的笔记边复习边整理,多做一下输出工作

        其次,发现使用gpt帮助理解一些知识点还真是方便(之前在B站过别人用gpt写一个AI训练模型,遇到一个AI回避的问题,去看国外的论文,用gpt帮助理解并阅读,快速得学习并开发出了对他而言新领域的模型,真的很强!)自己看之前的笔记,有些写得不太正确的地方,读得不太顺畅的地方,也许当时也没有很好的理解,这里用gpt也帮助我浅浅的重新理解了一下(菜鸟大三学生一枚,若有不对的地方也希望大家可以指出来,狠狠爱住!)

 

Spring容器及Bean的创建过程.pdf

然后也附上我和gpt的问答


我:spring设计Aware的目的


gpt:

Spring框架中的Aware接口和相关的Aware回调是为了实现对Spring容器的感知(Awareness)。Aware接口提供了一种机制,让Bean能够获取或与Spring容器中的特定组件进行交互。

通过实现Aware接口并在Spring容器中注册相应的Bean,可以获得对Spring容器的引用,以便在运行时与容器进行交互。Aware接口提供了一种松耦合的方式,使Bean能够访问Spring容器的功能,而无需显式依赖于Spring容器。

Aware接口的设计目的是为了增强Spring框架的灵活性和扩展性。它允许开发人员在需要与Spring容器进行交互的地方,通过实现相应的Aware接口来获取所需的引用或回调。

一些常见的Aware接口和它们的设计目的包括:

  • ApplicationContextAware:允许Bean获取对ApplicationContext的引用,以便在需要时与容器进行交互。
  • BeanFactoryAware:允许Bean获取对BeanFactory的引用,以便在需要时与BeanFactory进行交互。
  • BeanNameAware:允许Bean获取自身在容器中的Bean名称。
  • ResourceLoaderAware:允许Bean获取对ResourceLoader的引用,以便在需要时加载资源。
  • EnvironmentAware:允许Bean获取对Environment的引用,以便在需要时获取配置属性等。

通过实现这些Aware接口,Bean可以利用Spring容器提供的功能和资源,以实现更灵活、可扩展的应用程序设计。


我:那么有没有什么简单的示例来帮助我理解这个Aware机制呢


gpt:

当然,以下是一个简单的示例,用于演示Aware接口的使用方式:

首先,定义一个自定义的Bean,实现ApplicationContextAware接口:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class MyBean implements ApplicationContextAware {

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public void doSomething() {
        // 使用ApplicationContext进行交互
        String appName = applicationContext.getEnvironment().getProperty("application.name");
        System.out.println("Application Name: " + appName);
        // 进行其他操作...
    }
}

在上述示例中,MyBean实现了ApplicationContextAware接口,并在setApplicationContext方法中获取了对ApplicationContext的引用。

接下来,在Spring配置文件中定义该Bean:

<bean id="myBean" class="com.example.MyBean"/>

在配置文件中声明了一个名为myBean的Bean,并将其类指定为com.example.MyBean。

最后,在适当的地方使用该Bean:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyApp {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyBean myBean = context.getBean("myBean", MyBean.class);
        myBean.doSomething();
    }
}

在这个示例中,我们创建了一个ApplicationContext实例,加载了Spring配置文件。然后通过该ApplicationContext获取了myBean实例,并调用了其doSomething方法。

在doSomething方法中,我们可以使用ApplicationContext进行各种操作,例如获取环境变量、获取其他Bean的引用等。

这个示例展示了如何使用Aware接口(ApplicationContextAware)来获取对Spring容器的引用,并在Bean中进行相应的操作。通过这种方式,Bean可以与Spring容器进行交互,利用Spring框架的功能和资源。


我:也就是利用Aware,可以拿到ApplicationContext对象,来进行操作,如果没有Aware这个机制,是拿不到ApplicationContext的吗


gpt:

是的,如果没有Aware机制,普通的Bean是无法直接获取ApplicationContext对象的。

在普通的Bean中,无法直接获取ApplicationContext对象是因为ApplicationContext的创建和管理是由Spring容器负责的,普通的Bean并没有意识到自己是在Spring容器中运行的。

使用Aware机制,可以让Bean实现对ApplicationContext的感知,通过回调方法(如setApplicationContext)将ApplicationContext对象传递给Bean,使得Bean能够获取到ApplicationContext对象并进行操作。

如果没有Aware机制,普通的Bean可以通过其他方式间接获取ApplicationContext对象,例如通过依赖注入(Dependency Injection)或者实现ApplicationContextAware接口的自定义类的实例作为Bean的属性进行注入。但这些方式都需要手动配置或编码,并且不够灵活。

Aware机制的设计目的是为了让Bean能够在需要时与Spring容器进行交互,获得所需的功能和资源,提高灵活性和可扩展性。


我:好,我大概了解了,能再跟我多说一下关于Aware这个机制的其他东西


gpt:

当谈到Spring中的Aware机制时,还有一些其他方面需要了解:

  1. 自定义Aware接口:除了Spring提供的一些常用的Aware接口(如ApplicationContextAware),您还可以定义自己的Aware接口。通过定义自定义的Aware接口,您可以使Bean感知到其他特定的组件或资源,以便进行交互。
  2. 多个Aware接口的实现:一个Bean可以实现多个Aware接口,以便获取不同类型的资源或与不同的组件进行交互。通过实现多个Aware接口,Bean可以获取更多的功能和资源。
  3. Aware接口的扩展:除了ApplicationContextAware、BeanFactoryAware等常见的Aware接口,Spring还提供了其他扩展Aware接口,如MessageSourceAware(用于获取国际化消息资源)、EnvironmentAware(用于获取配置环境)、ResourceLoaderAware(用于加载资源)等。这些接口可以让Bean获取更多类型的Spring组件或资源。
  4. Aware接口的使用场景:Aware接口通常用于需要访问Spring容器或其他Spring组件的Bean。例如,当Bean需要获取国际化消息、访问配置属性、加载资源文件等时,可以使用相应的Aware接口来实现对相应组件的感知。
  5. 注解替代Aware接口:在较新的Spring版本中,为了简化代码和提高可读性,您也可以使用注解来代替Aware接口。例如,可以使用@Autowired注解直接注入ApplicationContext对象,而无需显式实现ApplicationContextAware接口。

需要注意的是,Aware机制应该被谨慎使用。过度依赖Aware接口可能导致代码与Spring框架的耦合性增加,降低代码的可移植性和可测试性。在设计和开发时,应该合理选择使用Aware接口,并考虑其他更好的设计方式,以避免过度依赖Aware机制。


我:好,那么Aware是如何实现的呢


gpt:

Aware接口的实现是通过Spring容器在创建Bean的过程中进行的。当Spring容器创建一个Bean时,会检测该Bean是否实现了某个Aware接口。如果是,则会调用相应的回调方法,将相关的资源或引用传递给该Bean。

具体的实现过程如下:

  1. Spring容器在创建Bean的过程中,会检查Bean是否实现了Aware接口。
  2. 如果Bean实现了Aware接口,Spring容器会创建该Bean的实例,并调用相应的回调方法。
  3. 在回调方法中,Spring容器将相关的资源或引用作为参数传递给Bean,让Bean获取所需的功能或与相关组件进行交互。
  4. Bean在回调方法中可以保存传递过来的资源或引用,并在需要时使用它们。
  5. 最后,Spring容器完成Bean的创建和初始化过程,该Bean可以在应用程序中使用了。

这种实现方式允许Bean在运行时获取Spring容器的引用,并与Spring容器或其他组件进行交互。由于Aware接口的实现是由Spring容器自动完成的,开发人员无需手动实现Aware接口的所有方法,只需要实现自己所需的回调方法即可。

值得注意的是,Aware接口的回调方法是由Spring容器负责调用的,开发人员只需要实现回调方法的逻辑即可。在Spring容器创建Bean并调用回调方法之后,开发人员可以在Bean的其他方法中使用获得的资源或引用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值