12306项目学习笔记(框架篇Base)

首先学习的是基础框架

ApplicationContextHolder

ApplicationContextHolder提供了一种静态方式来访问Spring容器中的Bean,适用于某些特定场景,如工具类和框架集成。

在12306项目中由于我们引入了RocketMQ消息队列,这些库的对象通常不是Spring管理的,无法直接使用@Autowired注入,所以需要ApplicationContextHolder类提供一种静态方式来访问Spring容器中的Bean。

比如在我们的TicketServiceImpl中的bean对象就是用以下方法获取的

@Override
public void run(String... args) throws Exception {
    ticketService = ApplicationContextHolder.getBean(TicketService.class);
}

ApplicationBaseAutoConfiguration

这个类是 Spring Boot 的自动配置类,使用了 @Configuration 注解,负责定义一些基础的 Bean。

  • ApplicationContextHolder: 这个 Bean 用于获取 Spring 应用上下文,可以通过静态方法方便地访问容器中的其他 Bean。
  • ApplicationContentPostProcessor: 这个 Bean 在应用启动完成后会执行,主要用于发布自定义事件 ApplicationInitializingEvent,可以用于初始化操作。
  • FastJsonSafeMode: 这个 Bean 在配置文件中启用 fastjson 的安全模式,确保 JSON 解析的安全性。

ApplicationContentPostProcessor

这个类实现了 ApplicationListener 接口,表示它会监听 Spring 应用的启动事件。

  • executeOnlyOnce: 使用 AtomicBoolean 确保事件只会被处理一次,避免重复操作。
  • onApplicationEvent: 当应用准备就绪时,会发布一个自定义事件 ApplicationInitializingEvent,可以在其他地方监听这个事件进行初始化操作。

ApplicationInitializingEvent

这是一个自定义事件类,继承自 ApplicationEvent。它用于在应用准备完成后发布特定的初始化事件,其他组件可以监听这个事件以执行相关的逻辑。

这个类主要是为了去初始化一些策略匹配模式,整个项目只有抽象策略选择  器 AbstractStrategyChoose监听了ApplicationInitializingEvent。

比如前端发送不同的信息以此匹配不同的处理方法,比如学生票和成人票不同的价格计算方式,以及支付方式所调用的不同接口。

FilterOrderConstant

这个类定义了一些常量,用于在过滤器中定义执行顺序。USER_TRANSMIT_FILTER_ORDER 常量可以帮助确保用户信息传递过滤器在合适的顺序中执行。

Singleton

这是一个单例模式的实现类,使用 ConcurrentHashMap 来存储单例对象。

  • get: 根据键名获取单例对象。
  • put: 将对象放入容器中,支持根据键名放入。
  • get(String key, Supplier supplier): 如果对象不存在,可以通过提供的 Supplier 创建并存储对象。

解决了spring bean在多线程环境下的线程安全问题。

你可能感兴趣的:(学习)