静下心来的个人专栏
上一篇

Spring 中的 IoC 容器、Bean 工厂与应用程序上下文

广告
选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。
大纲

Spring 中的 IoC 容器、Bean 工厂与应用程序上下文

在本文中,您将了解 Spring Framework 中 IoC Container、Application Context 和 Bean Factory 之间的区别。Spring IoC 容器是 Spring Framework 的核心。它创建类实例,将它们裝配在一起,配置它们,并管理它们从创建到销毁的完整生命周期。Spring 容器使用依赖注入 (DI) 来管理组成应用程序的组件。

Spring 中的 IoC 容器是什么?

在 Spring 中的控制反转和依赖注入一文中,我已经详细解释了这一点。在 Spring 框架中,我们不创建依赖项的实例,而是由框架为我们创建。

IoC – 控制反转意味着,我们没有创建依赖项的控制权,而是框架为我们做的。负责执行依赖注入的代码称为 IoC 容器。

StudentService.java

@Service
public class StudentService {
  @Autowired
  private StudentRepository repository;
  // Other logics
}

StudentRepository.java

@Repository
public class StudentRepository {
    //persistence logic
}

在上面的例子中,我们没有手动创建 StudentRepository 的实例,而是 spring 为我们创建了它。从技术上讲,Spring IoC 容器为我们创建了它。

控制反转是一种通过将反轉创建作业转移到容器或框架来确保解耦的技术。该框架还允许我们根据开发人员的需要自定义 Objection 创建并添加自定义行为。之所以称为反转,是因为该过程是反向的,其中 bean 创建和依赖由容器而不是 bean 本身控制。

控制反转的优势

1、解耦对象及其执行。

2、有助于运行时多态性。

3、更好的代码可维护性。

4、由于接口和实现之间的松散耦合,易于代码测试。

两种类型的 Spring IoC 容器

Spring 提供了以下两种类型的容器:

1、BeanFactory 容器

2、应用上下文容器

Spring 中的 BeanFactory 是什么?

BeanFactory 在 Spring 中也称为 BeanFactory Container。它是访问任何 Spring bean 容器的根接口。

Bean 工厂实现应尽可能支持标准的 bean 生命周期接口。 BeanFactory 是应用程序 bean、它们的配置和依赖项的中央注册表。

BeanFactory 使我们能够读取 bean 定义并使用 bean 工厂访问它们,如下所示。正如您之前已经了解依赖注入一样,我将只向您展示如何使用 BeanFactory 作为基础接口。

public class TestAutowireExample {
  public static void main(String[] args) {
    BeanFactory beanFactory = new AnnotationConfigApplicationContext(AutowireBeanConfig.class);
    System.out.println(beanFactory.getBean(Store.class));
  }
}

托管 bean 的全套初始化方法及其标准顺序是:

1、BeanNameAware 的 setBeanName

2、BeanClassLoaderAware 的 setBeanClassLoader

3、BeanFactoryAware 的 setBeanFactory

4、EnvironmentAware 的 setEnvironment

5、EmbeddedValueResolverAware 的 setEmbeddedValueResolver

6、ResourceLoaderAware 的 setResourceLoader(仅在应用程序上下文中运行时适用)

7、ApplicationEventPublisherAware 的 setApplicationEventPublisher(仅在应用程序上下文中运行时适用)

8、MessageSourceAware 的 setMessageSource(仅在应用程序上下文中运行时适用)

9、ApplicationContextAware 的 setApplicationContext(仅在应用程序上下文中运行时适用)

10、ServletContextAware 的 setServletContext(仅适用于在 Web 应用程序上下文中运行时)

11、BeanPostProcessors 的 postProcessBeforeInitialization 方法

12、InitializingBean 的 afterPropertiesSet

13、自定义初始化方法定义

14、BeanPostProcessors 的 postProcessAfterInitialization 方法

在关闭 bean 工厂时,将应用以下生命周期方法:

1、DestructionAwareBeanPostProcessors 的 postProcessBeforeDestruction 方法

2、DisposableBean 的销毁

3自定义销毁方法定义

Spring中的ApplicationContext是什么?

ApplicationContext 是为应用程序提供配置的中心接口。这在应用程序运行时是只读的,但如果实现支持,则可以重新加载。

public class TestAutowireExample {
  public static void main(String[] args) {
    ApplicationContext context = new AnnotationConfigApplicationContext(AutowireBeanConfig.class);
    System.out.println(context.getBean(Store.class));
  }
}

ApplicationContext 提供:

1、用于访问应用程序组件的 Bean 工厂方法。继承自 ListableBeanFactory。

2、以通用方式加载文件资源的能力。继承自 ResourceLoader 接口。

3、向注册的侦听器发布事件的能力。继承自 ApplicationEventPublisher 接口。

4、解决消息的能力,支持国际化。继承自 MessageSource 接口。

5、从父上下文继承。后代上下文中的定义将始终具有优先权。这意味着,例如,整个 Web 应用程序可以使用单个父上下文,而每个 servlet 都有自己的子上下文,该子上下文独立于任何其他 servlet。

建议在需要时使用 ApplicationContext 而不是 BeanFactory,因为它的一些实现类在 Spring 5.x 中已被弃用。

总结

我已经给你详细解释了 IoC 容器,即 ApplicationContext 和 BeanFactory。BeanFactory 首先完成繁重的工作,然后 ApplicationContext 添加额外的功能,如消息源读取、消息翻译等。

版权声明:著作权归作者所有。

X

欢迎加群学习交流

联系我们