spring 获取context单例

本文介绍了一个简单的Spring应用上下文初始化方法。通过一个静态方法initContext()来创建ClassPathXmlApplicationContext实例加载配置文件,并提供getContext()方法确保上下文单例且按需加载。这种方式适用于需要按需初始化Spring上下文的应用场景。
	private static ApplicationContext context;
	
	public static  void initContext(){
		context = new ClassPathXmlApplicationContext( "classpath*:config/spring/*.xml");
	}
	
	public static ApplicationContext getContext(){
		if(context==null)
			initContext();
		return context;
	}

 

### Spring 框架中的模式实现与使用 在 Spring 框架中,模式是一种核心的设计理念,广泛应用于管理 Bean 的生命周期。默认情况下,Spring 容器中的所有 Bean 都是以形式存在的,这意味着在整个应用上下文中只有一个实例会被创建并共享给所有的请求[^5]。 #### 1. **Spring 模式的核心原理** Spring 使用一种基于容器的机制来维护 Bean 实例。当定义了一个 Bean 并将其作用域设置为 `singleton`(这也是默认值),Spring 容器会在启动时创建这个 Bean 的唯一实例,并将其存储在一个缓存池中。后续对该 Bean 的任何依赖注入都会返回同一个实例[^5]。 ```xml <bean id="myBean" class="com.example.MyClass" scope="singleton"/> ``` 或者通过 Java 配置类: ```java @Configuration public class AppConfig { @Bean public MyClass myClass() { return new MyClass(); // 这是一个 Bean } } ``` #### 2. **Spring 模式的特点** - **延迟初始化**:如果未显式配置 `lazy-init=true` 属性,默认情况下,Spring 容器会立即加载所有 Bean。这有助于减少运行时错误的可能性,但也可能增加初始加载时间[^5]。 - **线程安全性**:由于 Spring 容器负责管理和分发 Bean,它本身已经处理好了线程安全问题。开发人员无需额外关注这一点,除非 Bean 内部的状态是非线程安全的[^5]。 #### 3. **自定义销毁逻辑** 对于某些需要释放资源的 Bean,可以通过配置 `destroy-method` 来指定其销毁回调函数。这样可以在应用程序关闭时优雅地清理资源[^2]。 ```xml <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- 数据源属性 --> </bean> ``` 或者通过注解方式: ```java @Bean(destroyMethod = "shutdown") public ExecutorService taskExecutor() { return Executors.newFixedThreadPool(10); } ``` #### 4. **与其他功能集成** Spring 提供了多种扩展点以便更好地支持模式的应用场景。如,通过实现 `InitializingBean`, `DisposableBean` 接口或使用 `@PostConstruct`, `@PreDestroy` 注解,可以方便地定制 Bean 初始化和销毁阶段的行为[^3]。 另外,借助于 AOP 技术,还可以轻松实现诸如事务管理等功能,进一步增强 Bean 的能力[^3]。 --- ### 示代码展示 下面给出一个简子说明如何在 Spring 应用程序中定义和使用 Bean: ```java // 定义一个普通的 POJO 类作为 Bean @Component public class MySingletonService { private String message; public void setMessage(String message) { this.message = message; } public void getMessage() { System.out.println("Message from Singleton Service: " + message); } } // 测试类 @SpringBootApplication public class DemoApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(DemoApplication.class, args); // 获取两次相同的 Bean 实例 MySingletonService service1 = context.getBean(MySingletonService.class); MySingletonService service2 = context.getBean(MySingletonService.class); // 修改其中一个实例的消息内容 service1.setMessage("Hello World!"); // 输出两个实例的结果验证它们确实是同一个对象 service1.getMessage(); // Hello World! service2.getMessage(); // Hello World! // 判断两者是否相等 System.out.println(service1 == service2); // true } } ``` 此示展示了 Spring 如何自动检测组件并将其实例化为 Bean,同时证明了无论何时从容器中获取该 Bean,得到的始终是同一份实例。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值