设计模式实战指南:从源码解析到Java后端架构的艺术

🎯 设计模式实战指南:从源码解析到Java后端架构的艺术

概述

本文档基于设计模式分类,详细介绍Java后端开发中各种设计模式的实际应用场景,结合Spring、MyBatis、Redis等主流框架的源码分析,帮助开发者深入理解设计模式在实践中的价值。

一、创建型模式

1. 单例模式(Singleton Pattern)

应用场景
  • 数据库连接池
  • 缓存管理器
  • 配置管理器
  • 日志记录器
Spring框架中的应用

Spring IoC容器本身就是单例模式的典型应用

// Spring ApplicationContext 单例实现
public class AnnotationConfigApplicationContext extends GenericApplicationContext {private final AnnotatedBeanDefinitionReader reader;private final ClassPathBeanDefinitionScanner scanner;public AnnotationConfigApplicationContext() {this.reader = new AnnotatedBeanDefinitionReader(this);this.scanner = new ClassPathBeanDefinitionScanner(this);}
}

Spring Bean的默认作用域就是单例

// Spring BeanFactory 中的单例管理
public class DefaultSingletonBeanRegistry extends FactoryBeanRegistrySupport {// 单例对象缓存private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);protected Object getSingleton(String beanName, boolean allowEarlyReference) {Object singletonObject = this.singletonObjects.get(beanName);if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {// 单例创建逻辑}return singletonObject;}
}
Redis客户端单例应用
// JedisPool 单例模式实现
public class RedisManager {private static volatile JedisPool jedisPool;public static JedisPool getInstance() {if (jedisPool == null) {synchronized (RedisManager.class) {if (jedisPool == null) {JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(100);config.setMaxIdle(10);jedisPool = new JedisPool(config, "localhost", 6379);}}}return jedisPool;}
}

2. 工厂方法模式(Factory Method Pattern)

应用场景
  • 数据库连接工厂
  • 消息队列工厂
  • 缓存工厂
  • 序列化器工厂
Spring框架中的应用

BeanFactory - Spring的核心工厂

// Spring BeanFactory 接口
public interface BeanFactory {Object getBean(String name) throws BeansException;<T> T getBean(String name, Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;
}// 具体实现类
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactoryimplements ConfigurableListableBeanFactory, BeanDefinitionRegistry {@Overridepublic <T> T getBean(Class<T> requiredType) throws BeansException {return getBean(requiredType, (Object[]) null);}
}
MyBatis中的工厂应用
// MyBatis SqlSessionFactory
public interface SqlSessionFactory {SqlSession openSession();SqlSession openSession(boolean autoCommit);SqlSession openSession(Connection connection);
}// 默认实现
public class DefaultSqlSessionFactory implements SqlSessionFactory {@Overridepublic SqlSession openSession() {return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);}
}

3. 抽象工厂模式(Abstract Factory Pattern)

应用场景
  • 数据库访问层抽象
  • 消息中间件抽象
  • 缓存系统抽象
Spring JDBC中的应用
// 数据源抽象工厂
public interface DataSource extends CommonDataSource, Wrapper {Connection getConnection() throws SQLException;Connection getConnection(String username, String password) throws SQLException;
}// 具体实现
public class HikariDataSource extends HikariConfig implements DataSource {@Overridepublic Connection getConnection() throws SQLException {return getConnection(username, password);}
}

4. 建造者模式(Builder Pattern)

应用场景
  • 复杂对象构建
  • 配置对象构建
  • 查询条件构建
MyBatis中的应用
// MyBatis SqlSessionFactoryBuilder
public class SqlSessionFactoryBuilder {public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);}public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);}}
}
Spring Boot配置构建
// Spring Boot ApplicationBuilder
public class SpringApplicationBuilder {private final SpringApplication application;public SpringApplicationBuilder(Class<?>... sources) {this.application = new SpringApplication(sources);}public SpringApplicationBuilder properties(String... defaultProperties) {this.application.setDefaultProperties(StringUtils.toStringArray(defaultProperties));return this;}
}

5. 原型模式(Prototype Pattern)

应用场景
  • 对象克隆
  • 配置复制
  • 模板复制
Spring中的应用
// Spring Bean的prototype作用域
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory {@Overridepublic Object getBean(String name) throws BeansException {return doGetBean(name, null, null, false);}protected <T> T doGetBean(String name, Class<T> requiredType, Object[] args, boolean typeCheckOnly) {// 对于prototype作用域的bean,每次都创建新实例if (mbd.isPrototype()) {Object prototypeInstance = null;try {beforePrototypeCreation(beanName);prototypeInstance = createBean(beanName, mbd, args);} finally {afterPrototypeCreation(beanName);}bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}}
}

二、结构型模式

1. 适配器模式(Adapter Pattern)

应用场景
  • 接口适配
  • 数据格式转换
  • 第三方库集成
Spring MVC中的应用
// HandlerAdapter 适配不同类型的处理器
public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
}// RequestMappingHandlerAdapter 适配 @RequestMapping 注解的处理器
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {@Overridepublic boolean supports(Object handler) {return handler instanceof HandlerMethod;}@Overrideprotected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {// 处理逻辑}
}
MyBatis中的适配器
// MyBatis TypeHandler 适配器
public interface TypeHandler<T> {void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;T getResult(ResultSet rs, String columnName) throws SQLException;T getResult(ResultSet rs, int columnIndex) throws SQLException;T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}// 具体实现
public class StringTypeHandler extends BaseTypeHandler<String> {@Overridepublic void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {ps.setString(i, parameter);}@Overridepublic String getNullableResult(ResultSet rs, String columnName) throws SQLException {return rs.getString(columnName);}
}

2. 桥接模式(Bridge Pattern)

应用场景
  • 抽象与实现分离
  • 多维度变化
  • 平台无关性
JDBC桥接模式
// JDBC驱动桥接
public interface Driver {Connection connect(String url, Properties info) throws SQLException;boolean acceptsURL(String url) throws SQLException;
}// MySQL驱动实现
public class Driver implements java.sql.Driver {@Overridepublic Connection connect(String url, Properties info) throws SQLException {// MySQL连接实现}
}// PostgreSQL驱动实现
public class Driver implements java.sql.Driver {@Overridepublic Connection connect(String url, Properties info) throws SQLException {// PostgreSQL连接实现}
}

3. 组合模式(Composite Pattern)

应用场景
  • 树形结构
  • 菜单系统
  • 权限管理
Spring Security中的应用
// Spring Security 权限组合
public interface GrantedAuthority extends Serializable {String getAuthority();
}// 角色权限组合
public class SimpleGrantedAuthority implements GrantedAuthority {private final String role;public SimpleGrantedAuthority(String role) {this.role = role;}@Overridepublic String getAuthority() {return this.role;}
}

4. 装饰器模式(Decorator Pattern)

应用场景
  • 功能增强
  • 缓存装饰
  • 日志装饰
Spring AOP装饰器
// Spring AOP 代理装饰
public interface AopProxy {Object getProxy();Object getProxy(ClassLoader classLoader);
}// JDK动态代理装饰
public class JdkDynamicAopProxy implements AopProxy, InvocationHandler {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 前置增强// 目标方法调用// 后置增强}
}
MyBatis插件装饰器
// MyBatis Interceptor 装饰器
public interface Interceptor {Object intercept(Invocation invocation) throws Throwable;Object plugin(Object target);void setProperties(Properties properties);
}// 分页插件装饰器
public class PageInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {// 分页逻辑装饰return invocation.proceed();}
}

5. 外观模式(Facade Pattern)

应用场景
  • 复杂子系统封装
  • API简化
  • 统一接口
Spring Boot自动配置外观
// Spring Boot 自动配置外观
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}// 内部封装了复杂的配置过程
public class SpringApplication {public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {return new SpringApplication(primarySources).run(args);}
}

6. 享元模式(Flyweight Pattern)

应用场景
  • 对象池
  • 缓存
  • 字符串常量池
数据库连接池
// HikariCP 连接池享元模式
public class HikariDataSource extends HikariConfig implements DataSource {private final HikariPool pool;@Overridepublic Connection getConnection() throws SQLException {return pool.getConnection();}
}// 连接池管理
public class HikariPool extends PoolBase {private final ConcurrentBag<PoolEntry> connectionBag;public Connection getConnection() throws SQLException {PoolEntry poolEntry = connectionBag.borrow(connectionTimeout, MILLISECONDS);return poolEntry.createProxyConnection(now(), leakTaskFactory.schedule(poolEntry));}
}

7. 代理模式(Proxy Pattern)

应用场景
  • 远程代理
  • 虚拟代理
  • 保护代理
  • 缓存代理
Spring AOP代理
// Spring AOP 代理实现
public class ProxyFactory extends ProxyCreatorSupport {public Object getProxy() {return createAopProxy().getProxy();}
}// CGLIB代理
public class CglibAopProxy implements AopProxy {@Overridepublic Object getProxy() {return getProxy(null);}@Overridepublic Object getProxy(ClassLoader classLoader) {// CGLIB代理创建逻辑}
}
MyBatis动态代理
// MyBatis Mapper代理
public class MapperProxy<T> implements InvocationHandler, Serializable {private final SqlSession sqlSession;private final Class<T> mapperInterface;@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 动态代理逻辑return sqlSession.selectOne(statement, args);}
}

三、行为型模式

1. 责任链模式(Chain of Responsibility Pattern)

应用场景
  • 过滤器链
  • 异常处理链
  • 权限验证链
Spring Security过滤器链
// Spring Security 过滤器链
public class FilterChainProxy extends GenericFilterBean {private List<SecurityFilterChain> filterChains;@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {doFilterInternal(request, response, chain);}private void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 过滤器链执行逻辑for (Filter filter : filters) {filter.doFilter(request, response, chain);}}
}
MyBatis插件链
// MyBatis 插件责任链
public class Plugin implements InvocationHandler {private final Object target;private final Interceptor interceptor;@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return interceptor.intercept(new Invocation(target, method, args));}
}

2. 命令模式(Command Pattern)

应用场景
  • 操作封装
  • 事务管理
  • 异步处理
Spring事务命令
// Spring 事务命令模式
public interface TransactionTemplate {<T> T execute(TransactionCallback<T> action) throws TransactionException;
}// 具体实现
public class TransactionTemplate extends DefaultTransactionDefinition implements TransactionOperations {@Overridepublic <T> T execute(TransactionCallback<T> action) throws TransactionException {TransactionStatus status = this.transactionManager.getTransaction(this);T result;try {result = action.doInTransactionWithoutResult(status);} catch (RuntimeException | Error ex) {rollbackOnException(status, ex);throw ex;}this.transactionManager.commit(status);return result;}
}

3. 解释器模式(Interpreter Pattern)

应用场景
  • 表达式解析
  • 配置解析
  • 查询语言解析
MyBatis SQL解析
// MyBatis SQL解析器
public class SqlSourceBuilder {public SqlSource parse(String originalSql, Class<?> parameterType, Map<String, Object> additionalParameters) {ParameterMappingTokenHandler handler = new ParameterMappingTokenHandler(configuration, parameterType, additionalParameters);GenericTokenParser parser = new GenericTokenParser("#{", "}", handler);String sql = parser.parse(originalSql);return new StaticSqlSource(configuration, sql, handler.getParameterMappings());}
}

4. 迭代器模式(Iterator Pattern)

应用场景
  • 集合遍历
  • 分页查询
  • 流式处理
Spring Data分页迭代
// Spring Data 分页迭代器
public interface Page<T> extends Slice<T> {int getTotalPages();long getTotalElements();List<T> getContent();
}// 具体实现
public class PageImpl<T> implements Page<T> {private final List<T> content;private final Pageable pageable;private final long total;@Overridepublic Iterator<T> iterator() {return content.iterator();}
}

5. 中介者模式(Mediator Pattern)

应用场景
  • 组件通信
  • 事件处理
  • 协调管理
Spring事件机制
// Spring 事件中介者
public interface ApplicationEventPublisher {void publishEvent(ApplicationEvent event);void publishEvent(Object event);
}// 具体实现
public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster {@Overridepublic void multicastEvent(ApplicationEvent event) {multicastEvent(event, resolveDefaultEventType(event));}@Overridepublic void multicastEvent(final ApplicationEvent event, ResolvableType type) {// 事件分发逻辑for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {invokeListener(listener, event);}}
}

6. 备忘录模式(Memento Pattern)

应用场景
  • 状态保存
  • 事务回滚
  • 撤销操作
Spring事务状态管理
// Spring 事务状态备忘录
public interface TransactionStatus extends SavepointManager, Flushable {boolean isNewTransaction();boolean hasTransaction();boolean isRollbackOnly();boolean isCompleted();
}// 具体实现
public class DefaultTransactionStatus extends AbstractTransactionStatus {private final Object transaction;private final boolean newTransaction;private boolean rollbackOnly;private boolean completed;
}

7. 观察者模式(Observer Pattern)

应用场景
  • 事件通知
  • 状态同步
  • 日志记录
Spring事件机制
// Spring 观察者模式
public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {void onApplicationEvent(E event);
}// 具体实现
@Component
public class UserEventListener implements ApplicationListener<UserCreatedEvent> {@Overridepublic void onApplicationEvent(UserCreatedEvent event) {// 处理用户创建事件System.out.println("User created: " + event.getUser());}
}

8. 状态模式(State Pattern)

应用场景
  • 状态机
  • 工作流
  • 订单状态
Spring状态机
// Spring Statemachine 状态模式
public interface StateMachine<S, E> {State<S, E> getState();void sendEvent(E event);void start();void stop();
}// 具体实现
@Configuration
@EnableStateMachine
public class OrderStateMachineConfig extends StateMachineConfigurerAdapter<OrderState, OrderEvent> {@Overridepublic void configure(StateMachineStateConfigurer<OrderState, OrderEvent> states) throws Exception {states.withStates().initial(OrderState.CREATED).state(OrderState.PAID).state(OrderState.SHIPPED).end(OrderState.DELIVERED);}
}

9. 策略模式(Strategy Pattern)

应用场景
  • 算法选择
  • 支付方式
  • 缓存策略
Spring缓存策略
// Spring 缓存策略
public interface CacheManager {Cache getCache(String name);Collection<String> getCacheNames();
}// Redis缓存策略
public class RedisCacheManager implements CacheManager {@Overridepublic Cache getCache(String name) {return new RedisCache(name, redisTemplate);}
}// EhCache缓存策略
public class EhCacheCacheManager implements CacheManager {@Overridepublic Cache getCache(String name) {return new EhCacheCache(name, ehcache);}
}

10. 模板方法模式(Template Method Pattern)

应用场景
  • 算法框架
  • 流程控制
  • 代码复用
Spring JdbcTemplate
// Spring JdbcTemplate 模板方法
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {@Overridepublic <T> T queryForObject(String sql, Class<T> requiredType, Object... args) throws DataAccessException {return queryForObject(sql, args, requiredType);}@Overridepublic <T> T queryForObject(String sql, Object[] args, Class<T> requiredType) throws DataAccessException {List<T> results = queryForList(sql, args, requiredType);return DataAccessUtils.singleResult(results);}// 模板方法,子类可以重写protected <T> List<T> queryForList(String sql, Object[] args, Class<T> elementType) throws DataAccessException {return query(sql, args, getSingleColumnRowMapper(elementType));}
}

11. 访问者模式(Visitor Pattern)

应用场景
  • 数据结构操作
  • 编译优化
  • 代码生成
Spring Bean访问者
// Spring Bean访问者
public interface BeanDefinitionVisitor {void visitBeanDefinition(BeanDefinition beanDefinition);
}// 具体实现
public class BeanDefinitionVisitorImpl implements BeanDefinitionVisitor {@Overridepublic void visitBeanDefinition(BeanDefinition beanDefinition) {// 访问Bean定义String beanClassName = beanDefinition.getBeanClassName();// 处理逻辑}
}

四、设计原则在Java后端开发中的应用

1. 单一职责原则(SRP)

// 好的设计:职责分离
@Service
public class UserService {public User createUser(UserDTO userDTO) {// 只负责用户创建逻辑}
}@Service
public class EmailService {public void sendWelcomeEmail(User user) {// 只负责邮件发送逻辑}
}

2. 开闭原则(OCP)

// 通过接口扩展,对修改关闭
public interface PaymentStrategy {void pay(BigDecimal amount);
}@Component
public class AlipayStrategy implements PaymentStrategy {@Overridepublic void pay(BigDecimal amount) {// 支付宝支付逻辑}
}@Component
public class WechatPayStrategy implements PaymentStrategy {@Overridepublic void pay(BigDecimal amount) {// 微信支付逻辑}
}

3. 里氏替换原则(LSP)

// 子类可以替换父类
public interface Cache {void put(String key, Object value);Object get(String key);
}public class RedisCache implements Cache {@Overridepublic void put(String key, Object value) {// Redis实现}@Overridepublic Object get(String key) {// Redis实现}
}public class EhCache implements Cache {@Overridepublic void put(String key, Object value) {// EhCache实现}@Overridepublic Object get(String key) {// EhCache实现}
}

4. 接口隔离原则(ISP)

// 接口分离,避免胖接口
public interface UserReader {User findById(Long id);List<User> findAll();
}public interface UserWriter {User save(User user);void delete(Long id);
}public interface UserService extends UserReader, UserWriter {// 组合多个小接口
}

5. 依赖倒置原则(DIP)

// 依赖抽象而不是具体实现
@Service
public class OrderService {private final PaymentStrategy paymentStrategy;public OrderService(PaymentStrategy paymentStrategy) {this.paymentStrategy = paymentStrategy;}public void processOrder(Order order) {paymentStrategy.pay(order.getAmount());}
}

6. 迪米特法则(LoD)

// 减少对象间的耦合
@Service
public class OrderService {private final UserService userService;public void createOrder(OrderDTO orderDTO) {// 不直接访问User的内部属性User user = userService.getUserById(orderDTO.getUserId());// 通过User的方法获取需要的信息if (user.canCreateOrder()) {// 创建订单逻辑}}
}

7. 合成复用原则(CRP)

// 优先使用组合而不是继承
@Service
public class OrderService {private final UserService userService;private final ProductService productService;private final PaymentService paymentService;// 通过组合复用功能,而不是继承public Order createOrder(OrderDTO orderDTO) {User user = userService.getUserById(orderDTO.getUserId());Product product = productService.getProductById(orderDTO.getProductId());// 创建订单逻辑return order;}
}

五、设计模式的最佳实践

1. 模式选择原则

  • 优先使用组合而非继承
  • 针对接口编程而非实现
  • 遵循开闭原则
  • 保持简单性

2. 常见反模式

  • 过度设计:不要为了使用模式而使用模式
  • 模式滥用:避免在不合适的地方使用设计模式
  • 忽略性能:某些模式可能带来性能开销

3. 性能考虑

// 单例模式的双重检查锁定
public class Singleton {private static volatile Singleton instance;public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

4. 测试友好性

// 依赖注入便于测试
@Service
public class UserService {private final UserRepository userRepository;private final EmailService emailService;public UserService(UserRepository userRepository, EmailService emailService) {this.userRepository = userRepository;this.emailService = emailService;}// 方法便于单元测试public User createUser(UserDTO userDTO) {User user = new User(userDTO);user = userRepository.save(user);emailService.sendWelcomeEmail(user);return user;}
}

总结

设计模式是Java后端开发中的重要工具,它们帮助我们:

  1. 提高代码质量:通过模式化的设计,代码更加清晰、可维护
  2. 增强可扩展性:遵循开闭原则,便于功能扩展
  3. 提升开发效率:复用成熟的设计方案,避免重复造轮子
  4. 改善团队协作:统一的代码风格和架构模式

在实际开发中,应该根据具体场景选择合适的模式,避免过度设计,同时注重性能和可测试性。通过深入理解Spring、MyBatis等主流框架的源码,我们可以更好地掌握设计模式的实际应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910576.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python Arrow 库详解:更智能的日期时间处理

1. 安装与基本用法 安装 Arrow pip install arrow基本使用示例 import arrow# 获取当前时间 now arrow.now() print(now) # 输出: 2023-07-15T14:30:45.12345608:00# 创建特定时间 dt arrow.get(2023-07-15 14:30:00, YYYY-MM-DD HH:mm:ss) print(dt) # 输出: 2023-07-15T…

大家电破渠道困局,小家电攻用户体验,云徙有何解法?

中国家电行业正经历深刻转型。 自2018年市场规模触及8400亿顶峰后&#xff0c;行业从增量竞争转向存量博弈。与此同时&#xff0c;线上渠道在2023年首次以58%的占比超越线下&#xff0c;其中扫地机器人等小家电品类线上渗透率突破90%。消费需求也在同步重构——从家庭场景向个…

DMDPC多副本数据分布测试

需求&#xff1a;测试建表和插入数据是否会根据分布列进行自动分发。 验证方法&#xff1a;1&#xff09;准备基础环境&#xff1a;创建用户和表空间。2&#xff09;创建数据分布测试表&#xff0c;并插入数据。3&#xff09;查询指定分区数据&#xff0c;验证数据分布情况。 …

Qt/C++开发监控GB28181系统/rtp解包/jrtplib库的使用/同时支持udp和tcp被动和主动三种方式解包

一、前言说明 通过sip协议仅仅是交互&#xff0c;音视频数据的收发最终并不是通过sip传输的&#xff0c;而是通过将数据打包成rtp的格式再通过udp或者tcp通信的&#xff0c;sip协议仅仅是告知对方待会要往哪里发数据&#xff0c;是udp还是tcp。由于数据都是rtp包格式&#xff…

集群聊天服务器---muduo库的使用

使用 C 和 muduo 网络库来实现一个简单的聊天服务器和客户端。 服务器端&#xff1a; class chatServer { public:// 初始化TcpServerchatServer(muduo::net::EventLoop *loop,const muduo::net::InetAddress &listenAddr): _server(loop, listenAddr, "chatServer&…

关于Net Core Web API 项目测试 数据库模拟的两种不同方法 DC_week 6

1.关系型数据库 插件&#xff1a;Microsoft.EntityFrameworkCore.InMemory Microsoft.EntityFrameworkCore.InMemory 是一个用于测试的“临时内存数据库”&#xff0c;让你在不连接真实数据库的情况下&#xff0c;测试 EF Core 的功能。 使用时就是用具体这个框架里面已经…

如何获取 vscode 的 vsix 离线插件安装包

1、搜索所需要的插件 Extensions for Visual Studio family of products | Visual Studio Marketplace网址 2、点击 Repository 跳转到对应的 git 仓库 3、在 git 仓库依次选择 main , Tags, View all tags 4、选择你想下载的版本&#xff0c;并点击 downloads 5、往下滑动&…

ULS23 挑战:用于计算机断层扫描中 3D 通用病变分割的基准模型及基准数据集|文献速递-深度学习医疗AI最新文献

Title 题目 The ULS23 challenge: A baseline model and benchmark dataset for 3D universal lesion segmentation in computed tomography ULS23 挑战&#xff1a;用于计算机断层扫描中 3D 通用病变分割的基准模型及基准数据集 01 文献速递介绍 每年进行的CT检查数量持续…

WebSocket 端点 vs Spring Bean

在websocket端点中注入业务service时&#xff0c;不能像普通的springbean一样通过Autowired或Resource注解进行注入。主要原因是websocket端点与spring容器中的bean的生命周期管理容器不同。 WebSocket 端点&#xff08;ServerEndpoint&#xff09;和 Spring Bean 的生命周期存…

MySQL8:jdbc插入数据后获取自增ID

pom文件&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"&…

MyBatis(Web后端开发第二期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 JDBC、数据库连接池、lombok日志输出SQL注入数据封装XML映射文件动态SQL<if><where><set><foreach><sql><include> 配置文件 Mybatis是是一…

Angular1--Hello

最近有个小错误&#xff0c;因为最近还是在看thingsboard&#xff0c;最近终于看到前端的代码&#xff0c;突然发现怎么全是ts的文件&#xff0c;仔细一看原来并不是之前认为的AngularJS&#xff0c;而是Angular。。。我tm真的无语了&#xff0c;又要去重新学。。。 Angular的…

什么是redission看门狗机制

Redisson 的看门狗机制(Watchdog Mechanism)是其实现可重入分布式锁时的一个核心特性,主要用于解决业务逻辑执行时间超过锁的过期时间(leaseTime)而导致锁提前释放,进而引发数据不一致的问题。它是一个自动的锁续期机制。 🔍 核心问题:为什么需要看门狗? 分布式锁的…

黑马程序员苍穹外卖DAY1

1. 前端页面能正常显示但无法登录&#xff08;一直转圈圈&#xff09; 找到下面路径的dev.yml port一定要跟自己本机的保持一致&#xff0c;&#xff0c;username和password也一定是自己主机的用户名和密码&#xff0c;不然连不上。 登录界面的密码为数据库表的密码&#xff0…

Frida Hook Android App 点击事件实战指南:从进程识别到成功注入

一、背景与目标 在逆向分析和自动化测试中&#xff0c;Hook Android 的点击事件是调试 UI 交互逻辑的重要手段之一。本文将以实际案例讲解如何通过 Frida Hook public void onClick(View view) 方法&#xff0c;并解决常见的 Hook 失败问题&#xff0c;最终实现对登录按钮的监…

Arduino Nano 33 BLE Sense Rev 2开发板使用指南之【环境搭建 / 点灯】

一、硬件介绍 1、产品特点 Arduino Nano 33 BLE Rev2&#xff0c;利用了nRF52840微控制器的先进功能。这款32位Arm Cortex-M4 CPU 64 MHz与MicroPython的兼容性增强了板子的灵活性&#xff0c;使其更容易被更广泛的开发者社区所接受。 该开发板的突出特点是其蓝牙低功耗&…

[QT]-宏使用

用宏,务必写清文档并用 do {…} while (0)为啥呢,示例 在 C/C++ 中,使用 do { … } while (0) 包裹宏定义是一种经典的最佳实践,主要用于解决宏展开后的语法和逻辑问题。以下是详细解释和示例: 一、为什么用 do { … } while (0) 包裹宏? 避免分号导致的语法错误 问题场…

python-property、反射

# ### property """ 可以把方法变成属性 : 可以动态的控制属性的获取,设置,删除相关操作 property 获取属性 方法名.setter 设置属性 方法名.deleter 删除属性 """ # 方法一 """是同一个方法名""" class MyCla…

【自动鼠标键盘控制器|支持图像识别】

[软件名称]: 电脑图像识别 [软件大小]: 57.2 MB [下载通道]: 夸克盘 | 迅雷盘 &#x1f3ae;【自动鼠标键盘控制器&#xff5c;支持图像识别】基于Python开发的智能自动化工具 轻量便捷的自动化操作工具&#xff0c;集成图像识别、鼠标控制、键盘模拟等功能&#xff0c;轻松…

ISO/IEC 8824规范实际应用案例

案例 1&#xff1a;X.509 数字证书&#xff08;互联网安全基石&#xff09; 标准依据&#xff1a;RFC 5280 (基于 ASN.1 定义) 核心应用&#xff1a; Certificate :: SEQUENCE {tbsCertificate TBSCertificate, -- 证书主体signatureAlgorithm AlgorithmIdentifier,…