深入理解Spring的ApplicationContext:案例详解与应用

深入理解Spring的ApplicationContext:案例详解与应用

在Spring框架的丰富生态中,ApplicationContext扮演着至关重要的角色。作为BeanFactory的扩展,ApplicationContext不仅继承了其所有功能,还引入了更多高级特性,使得Spring容器的管理更加灵活和方便。本文将结合CSDN上的一篇热门文章,通过案例学习,带您深入了解ApplicationContext的基础概念和应用场景。

ApplicationContext与BeanFactory的对比

ApplicationContext通常被称为Spring上下文,它是BeanFactory的派生接口,提供了更多面向实际应用的功能。ApplicationContext能够通过配置方式实现许多BeanFactory需要编程实现的功能,使得Spring容器的管理更加灵活和方便。

特性 ApplicationContext BeanFactory
范围 企业级 基础级
配置 支持消息资源、事件发布等 仅支持基础的bean管理
AOP 内置AOP支持
事件 支持应用程序事件
类型转换 提供类型转换服务

案例学习:ApplicationContext的应用

为了更好地理解ApplicationContext,我们将通过一个简单的案例来学习它的使用。我们将创建两个User对象,一个配置为单例(singleton),另一个配置为多例(prototype)。

创建User对象

首先,我们定义一个简单的User类:

@Data
public class User {
    private String id;
    private String name;
    private Integer age;
}

配置ApplicationContext

接下来,我们创建一个名为applicationContext.xml的Spring配置文件:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <!-- singleton -->
    <bean id="UserSingleton" class="com.example.User" scope="singleton"
          p:id="1" p:name="辰兮" p:age="22"/>

    <!-- prototype -->
    <bean id="UserPrototype" class="com.example.User" scope="prototype"
          p:id="2" p:name="辰兮要努力" p:age="23"/>

</beans>

测试ApplicationContext

现在,我们创建一个测试类来学习ApplicationContext的使用:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

public class ApplicationContextDemo {

    private static final Logger logger = LoggerFactory.getLogger(ApplicationContextDemo.class);

    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

        // Singleton: 单实例
        User user = applicationContext.getBean("UserSingleton", User.class);
        User user1 = applicationContext.getBean("UserSingleton", User.class);

        logger.info("user.hashCode() is:{}", user.hashCode());
        logger.info("user1.hashCode() is:{}", user1.hashCode());
        logger.info("user is:{}", user);
        logger.info("user1 is:{}", user1);
        logger.info("user == user1 :{}", user == user1);

        // Prototype: 多实例
        User user3 = applicationContext.getBean("UserPrototype", User.class);
        User user4 = applicationContext.getBean("UserPrototype", User.class);

        logger.info("user3.hashCode() is:{}", user3.hashCode());
        logger.info("user4.hashCode() is:{}", user4.hashCode());
        logger.info("user3 is:{}", user3);
        logger.info("user4 is:{}", user4);
        logger.info("user3 == user4 :{}", user3 == user4);
    }
}

执行代码

控制台日志输出将显示单例bean的两个引用指向同一个对象,而多例bean每次获取都是一个新的实例:

user.hashCode() is:1446002
user1.hashCode() is:1446002
user is:User(id=1, name=辰兮, age=22)
user1 is:User(id=1, name=辰兮, age=22)
user == user1 :true
user3.hashCode() is:266875004
user4.hashCode() is:266875004
user3 is:User(id=2, name=辰兮要努力, age=23)
user4 is:User(id=2, name=辰兮要努力, age=23)
user3 == user4 :false

代码逻辑

  • 创建Spring的工厂类:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  • 通过工厂解析XML获取Bean实例:
User user = (User) applicationContext.getBean("UserSingleton");

拓展补充

  • 对象相等则hashCode一定相等;
  • hashCode相等对象未必相等。

使用==比较两个对象,可以复习一下Spring作用域相关知识点。

ApplicationContext总结

如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的身躯了。ApplicationContextBeanFactory派生而来,提供了更多面向实际应用的功能,是“应用的容器”。

结语

通过本文的学习,您应该对ApplicationContext有了更深入的理解。它不仅是Spring框架的核心组件,也是您在构建企业级应用程序时的得力助手。希望本文能够帮助您在实际开发中更好地利用ApplicationContext,构建出更加健壮和可维护的应用程序。

相关推荐

  1. 深入理解SpringApplicationContext案例详解应用

    2024-03-14 00:30:04       21 阅读
  2. 深入理解 LVS:配置应用详解

    2024-03-14 00:30:04       21 阅读
  3. 深入理解RabbitMQ:配置应用场景详解

    2024-03-14 00:30:04       19 阅读
  4. 深入理解服务器路由功能:配置应用详解

    2024-03-14 00:30:04       4 阅读
  5. 深入理解 @Transactional 注解在 Spring应用

    2024-03-14 00:30:04       18 阅读
  6. MySQL中索引:深入理解案例解析

    2024-03-14 00:30:04       34 阅读
  7. spring——BeanFactoryApplicationContext接口、bean标签

    2024-03-14 00:30:04       23 阅读
  8. 深入理解应用Flink中水印机制

    2024-03-14 00:30:04       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-14 00:30:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-14 00:30:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-14 00:30:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-14 00:30:04       18 阅读

热门阅读

  1. js小知识

    2024-03-14 00:30:04       22 阅读
  2. 子查询

    2024-03-14 00:30:04       24 阅读
  3. JenKins 中的new Item各个选项应该怎选择

    2024-03-14 00:30:04       19 阅读
  4. HAProxy适配openGauss使用指导书

    2024-03-14 00:30:04       22 阅读
  5. 在Rust中,探索word到pdf的转换

    2024-03-14 00:30:04       23 阅读
  6. 英语阅读挑战

    2024-03-14 00:30:04       22 阅读
  7. 华为机试题-字符串压缩

    2024-03-14 00:30:04       20 阅读
  8. 测开面经学习笔记

    2024-03-14 00:30:04       18 阅读
  9. C++进阶学习

    2024-03-14 00:30:04       21 阅读