单例Bean

本文详细介绍了Java中单例模式的实现方法,包括普通单例、懒汉式单例、饿汉式单例、双重检查锁定和静态内部类等,并通过实例展示了如何在实际开发中应用这些模式,以及如何进行性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码:

public class Singleton {
	//私有化构造器
	private Singleton(){
	}
	//单例缓存者,惰性初始化,第一次使用时初始化
	private static class InstanceHolder
	{
		private static final Singleton INSTANCE = new Singleton();
	}
	//提供全局访问点
	public static Singleton getInstance(){
		return InstanceHolder.INSTANCE;
	}
	//提供一个计数器来验证一个ClassLoader一个实例
	private int counter=0;
}

首先私有化构造器,其次使用InstanceHolder静态内部类持有单例对象,这样可以得到惰性初始化好处。最后提供全局访问点getInstance.使得需要该单例实例的对象能够获取到。
Bean 是 Spring 框架中非常重要的一部分,通常也是面试中的高频考点。以下是关于 Bean 面试题的一个简要介绍及解答思路: ### 什么是 Bean? 在 Spring 容器中,默认情况下所有的 Bean 都是以 **模式 (Singleton Pattern)** 创建的。这意味着在整个应用上下文中,对于某个 Bean 只会存在唯一的一个实。无论我们通过 `@Autowired` 注入多少次这个 Bean,实际上获得的都是同一个对象引用。 #### 示代码: ```java @Component public class SingletonBean { public String getName() { return "我是 Bean"; } } ``` --- ### 常见 Bean 面试问题 1. **Spring 中有多少种作用域(Scope),默认的作用域是什么?** - 答案:Spring 提供了多种 Scope,包括但不限于 `singleton`, `prototype`, `request`, `session` 和 `application`。 默认的作用域是 `singleton`,表示容器内只有一个实被创建并共享给所有使用者。 2. **如何验证一个 Bean 是否为?** - 我们可以通过多次注入该 Bean 并比较其哈希值 (`hashCode`) 来判断是否每次得到的都是相同的实。 ```java @Autowired private SingletonBean bean1; @Autowired private SingletonBean bean2; // 测试两个 bean 实际上是不是同一对象 System.out.println(bean1 == bean2); // 输出 true 表明它们确实相等 ``` 3. **如果 Bean 内部维护了一个可变的状态会发生什么情况?** - 这是一个潜在的问题点!由于多个线程可能会同时访问同一个 Bean 的内部成员变量,如果没有妥善处理并发控制(如加锁或使用线程安全的数据结构),那么就会导致数据竞争条件下的错误结果或者是不确定的行为发生。 4. **能否将 prototype 类型的依赖注入到 singleton Bean 中去呢? 如果可以的话需要注意些什么吗?** - 当然能这么做! 不过需要注意的是,Spring只会在初始化阶段装配一次原型类型的组件进到那个一实里头; 后续即便原形bean已被销毁也不会再动态刷新替换进去新的版本. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值