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

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

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

按名称查找

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

tips:

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

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

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

前提

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

xml 复制代码
<?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都已经被创建并准备就绪。

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

测试

java 复制代码
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);
}
java 复制代码
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、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。

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

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

相关推荐
cjy00011117 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
小江的记录本18 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji341618 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
卓怡学长18 小时前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate
程序员cxuan18 小时前
人麻了,谁把我 ssh 干没了
人工智能·后端·程序员
wuyikeer20 小时前
Spring Framework 中文官方文档
java·后端·spring
Victor35620 小时前
MongoDB(61)如何避免大文档带来的性能问题?
后端
Victor35620 小时前
MongoDB(62)如何避免锁定问题?
后端
wuyikeer20 小时前
Spring BOOT 启动参数
java·spring boot·后端
子木HAPPY阳VIP21 小时前
Ubuntu 22.04 VMware 设置固定IP配置
人工智能·后端·目标检测·机器学习·目标跟踪