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<ApplicationReadyEvent>
接口,表示它会监听 Spring 应用的启动事件。
- executeOnlyOnce: 使用
AtomicBoolean
确保事件只会被处理一次,避免重复操作。 - onApplicationEvent: 当应用准备就绪时,会发布一个自定义事件
ApplicationInitializingEvent
,可以在其他地方监听这个事件进行初始化操作。
ApplicationInitializingEvent
这是一个自定义事件类,继承自 ApplicationEvent
。它用于在应用准备完成后发布特定的初始化事件,其他组件可以监听这个事件以执行相关的逻辑。
这个类主要是为了去初始化一些策略匹配模式,整个项目只有抽象策略选择 器 AbstractStrategyChoose监听了
ApplicationInitializingEvent。
比如前端发送不同的信息以此匹配不同的处理方法,比如学生票和成人票不同的价格计算方式,以及支付方式所调用的不同接口。
FilterOrderConstant
这个类定义了一些常量,用于在过滤器中定义执行顺序。USER_TRANSMIT_FILTER_ORDER
常量可以帮助确保用户信息传递过滤器在合适的顺序中执行。
- 过滤器链执行:在请求处理过程中,Servlet 容器会按照过滤器的注册顺序依次调用所有已注册的过滤器。每个过滤器的
doFilter
方法会被执行。
Singleton
这是一个单例模式的实现类,使用 ConcurrentHashMap
来存储单例对象。
- get: 根据键名获取单例对象。
- put: 将对象放入容器中,支持根据键名放入。
- get(String key, Supplier<T> supplier): 如果对象不存在,可以通过提供的
Supplier
创建并存储对象。
解决了spring bean在多线程环境下的线程安全问题。