前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Framework IOC依赖查找 - 按名称查找解析

Spring Framework IOC依赖查找 - 按名称查找解析

作者头像
关忆北.
发布2023-11-20 08:53:37
960
发布2023-11-20 08:53:37
举报
文章被收录于专栏:关忆北.关忆北.

IoC按名称查找共分为三类:

  • 按名称
  • 按类型
  • 按集合

按名称查找

在Spring Framework中,实时加载和延迟加载是指在容器启动时是否立即实例化bean的不同策略。下面我们将分别介绍这两种加载方式及其应用场景。

tips:

当涉及到懒加载和延时加载时,需要明确它们实际上是不同的概念。

懒加载(Lazy Loading) 是指在需要使用某个资源或对象时才进行加载,而不是在应用程序启动时就提前加载。这意味着直到第一次访问该资源或对象之前,它都不会被加载到内存中。懒加载可以帮助减少启动时间和内存占用。

延时加载(Delayed Loading) 则是指在特定条件下推迟 [Something went wrong, please try again later.]

前提

请先在resource目录下新建文件:dependency-lookup-context.xml,并配置:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  https://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/context
  https://www.springframework.org/schema/context/spring-context.xsd">

  #实时加载
  <bean id="user" class="org.thinging.in.spring.ioc.overview.domain.User">
    <property name="id" value="1"/>
    <property name="name" value="Liutx"/>
  </bean>

  #延时加载
  <bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
    <property name="targetBeanName" value="user"/>
  </bean>

</beans>

实时加载(Eager Loading)

实时加载是指在Spring容器启动时就立即实例化所有的bean。具体来说,在使用ApplicationContext作为容器时,如果不显式地配置为延迟初始化,那么所有的单例bean都会在容器启动时被实例化。实时加载能够确保在应用程序运行过程中,所有需要使用的bean都已经被创建并准备就绪。

代码语言:javascript
复制
//实时加载 配置xml配置文件
BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/dependency-lookup-context.xml");
lookUpInReal(beanFactory);
代码语言:javascript
复制
/**
 * BeanFactory按名称实时查找
 * @param beanFactory bean工厂对象
 */
private static void lookUpInReal(BeanFactory beanFactory) {
    //启动Spring上下文
    User user = beanFactory.getBean("user", User.class);
    System.out.println(user);
}
测试
代码语言:javascript
复制
public class DependecyLookUpDemo {
    public static void main(String[] args) {
        //实时加载 配置xml配置文件
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/dependency-lookup-context.xml");
        lookUpInReal(beanFactory);
    }
}
```java

![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/0569800e731640bdad52d19a2edc95a1~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1632&h=416&s=64674&e=png&b=2d2d2d)

## 延迟加载(Lazy Loading)

延迟加载是指在Spring容器启动时并不立即实例化所有的bean,而是在首次访问该bean时才进行实例化。这种方式可以节省资源,并且对于某些特定情况下并不总是需要使用的bean来说,也能提高启动速度。

```java
/**
 * BeanFactory按名称延时查找
 * @param beanFactory bean工厂对象
 */
private static void lookUpLazy(BeanFactory beanFactory) {
    ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory");
    User userLazyLoad = objectFactory.getObject();
    System.out.println("延迟查找:" + userLazyLoad);
}
代码语言:javascript
复制
public class DependecyLookUpDemo {
    public static void main(String[] args) {
        //实时加载 配置xml配置文件
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("META-INF/dependency-lookup-context.xml");
        lookUpLazy(beanFactory);
    }
}
测试
应用场景和优缺点
  • 实时加载的应用场景:
    • 当所有的bean都是必须在应用程序启动时就准备好的,且对启动时间没有特别要求时,可以选择实时加载。
    • 实时加载能够在应用程序运行时尽快暴露出潜在的配置错误,有助于提早发现问题。
  • 延迟加载的应用场景:
    • 当部分bean是可选的或在应用程序的运行过程中并不总是需要使用时,可以选择延迟加载。
    • 对于某些资源密集型的bean,延迟加载能够减少启动时间和内存占用。
  • 优缺点比较:
    • 实时加载可以在应用程序启动时立即发现配置问题,但可能增加启动时间和内存占用。
    • 延迟加载可以减少启动时间和内存占用,但在首次访问时可能会引入一些性能开销。

在实际应用中,根据具体的需求和场景来选择合适的加载方式是非常重要的。

后续内容文章持续更新中…

近期发布。


关于我

👋🏻你好,我是Debug.c。一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。

🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。

📞如果您对我感兴趣,请联系我。

若有收获,就点个赞吧,喜欢原图请私信我。

pexels-elkhan-ganiyev-15118791.jpg
pexels-elkhan-ganiyev-15118791.jpg
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 按名称查找
    • tips:
    • 前提
    • 实时加载(Eager Loading)
      • 测试
        • 测试
          • 应用场景和优缺点
          • 后续内容文章持续更新中…
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档