单例模式(Singleton)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在MyBatis、Redisson、AMQP等依赖包中,单例模式被广泛应用。以下是这些框架中单例模式的经典实现及举例:
1. MyBatis 中的单例模式
MyBatis 中的 SqlSessionFactory
是一个典型的单例模式实现。
实现方式:
SqlSessionFactory
是一个重量级对象,通常在整个应用生命周期中只需要一个实例。- 通过
SqlSessionFactoryBuilder
创建SqlSessionFactory
实例,并将其缓存起来。
代码示例:
public class MyBatisUtil {private static SqlSessionFactory sqlSessionFactory;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSessionFactory getSqlSessionFactory() {return sqlSessionFactory;}
}
使用场景:
- 在应用中全局共享
SqlSessionFactory
实例,避免重复创建和资源浪费。
2. Redisson 中的单例模式
Redisson 中的 RedissonClient
是一个典型的单例模式实现。
实现方式:
RedissonClient
是 Redisson 的核心客户端对象,通常在整个应用中只需要一个实例。- 通过
Redisson.create()
方法创建RedissonClient
实例,并将其缓存起来。
代码示例:
public class RedissonUtil {private static RedissonClient redissonClient;static {Config config = new Config();config.useSingleServer().setAddress("redis://127.0.0.1:6379");redissonClient = Redisson.create(config);}public static RedissonClient getRedissonClient() {return redissonClient;}
}
使用场景:
- 在应用中全局共享
RedissonClient
实例,用于操作 Redis 数据。
3. AMQP(如 RabbitMQ)中的单例模式
在 RabbitMQ 中,ConnectionFactory
和 Connection
通常是单例模式实现。
实现方式:
ConnectionFactory
是创建 RabbitMQ 连接的核心对象,通常只需要一个实例。Connection
是 RabbitMQ 的连接对象,通常也会被缓存起来复用。
代码示例:
public class RabbitMQUtil {private static ConnectionFactory connectionFactory;private static Connection connection;static {connectionFactory = new ConnectionFactory();connectionFactory.setHost("localhost");connectionFactory.setPort(5672);connectionFactory.setUsername("guest");connectionFactory.setPassword("guest");try {connection = connectionFactory.newConnection();} catch (Exception e) {e.printStackTrace();}}public static Connection getConnection() {return connection;}
}
使用场景:
- 在应用中全局共享
Connection
实例,避免频繁创建和销毁连接,提高性能。
总结
单例模式在 MyBatis、Redisson、AMQP 等框架中的经典实现主要体现在以下方面:
- 全局唯一性:确保核心对象(如
SqlSessionFactory
、RedissonClient
、Connection
)只有一个实例。 - 资源复用:避免重复创建和销毁对象,节省系统资源。
- 全局访问点:通过静态方法或工具类提供全局访问入口。
在实际开发中,单例模式常用于管理数据库连接、缓存客户端、消息队列连接等重量级对象。