1.状态机的介绍和使用
2.什么是 JCP, JSR ?
3.Spring框架@PostConstruct注解详解
4.ApplicationRunner、InitializingBean、@PostConstruct 执行顺序
状态机的介绍和使用
状态机的探索与实践
状态机,作为现实世界运行逻辑的抽象工具,它的基本结构由四个关键元素构成:状态(State)、事件(Event)、idea 源码 hadoop动作(Action)和变换(Transition)。这些元素共同构建了一个有限状态自动机,用于描述系统的行为模式。 DSL(领域特定语言)在状态机设计中扮演着重要角色。它是一种清晰、简洁的沟通方式,内部DSL如正则表达式专注于特定领域的应用,如字符串匹配,而外部DSL如Struts的XML配置则提供更灵活的配置手段,常常与通用语言相结合,以支持语法解析。 工作台级别的DSL工具如Workbench,虽然功能强大,源码什么牌子但成本较高,提供了产品化和可视化界面。相比之下,内部DSL如Groovy的XML生成或MarkupBuilder简化XML结构,更为简洁直接;而外部DSL如plantUML则提供了友好的定制语法,配合解析器使用,能够更高效地表达复杂状态流程。状态机示例与实现
Spring StateMachine
官网:Spring State Machine
源码:GitHub
API文档:Spring StateMachine API
特点:易于使用,分层结构,集成Spring IOC,支持UML建模和持久化存储。
COLA状态机DSL
面向对象架构,尤其适用于领域驱动设计(DDD)场景,提供高性能的定制状态机设计。
在实际应用中,例如在iTMS运输需求单管理中,状态机被用于描述从待分配到全部妥投的完整流程,包括但不限于状态“待分配”、封神指标源码“已分配”、“运输中”等,通过事件如`TransNeedAssignCarrierEvent`和`TransNeedAssignCarEvent`触发状态转换。状态机操作示例
状态监听:通过`StateMachineListener`监控状态变化,如@Component的监听器实现。
配置:初始化状态机并添加状态监听,如`StateMachineConfig`中的@PostConstruct方法。
接口实现:
获取状态列表:info请求接口。
启动状态机:start请求启动流程。
事件触发:event接口处理用户请求。
获取当前状态:state接口返回当前状态。
通过这些实例,状态机在系统中的操作变得直观且易于管理,同时与DDD融合,增强了模型的精确性和开发效率。什么是 JCP, JSR ?
作为资深的Java开发者,我对Java的认识虽深但又浅显,大学时初次接触JDK 1.4的号码统计源码场景仍历历在目。尽管日常编码繁忙,我从未有机会深入了解Java的历史和精髓,比如今天我们要探讨的“JCP与JSR是什么”。对于科班出身的程序员来说,这是基本的Java文化素养,而对半路转行者来说,它们则是一份独特的Java语言烙印。 Java Community Process (JCP) 成立于年的JCP,是一个全球开放的Java标准制定机构,由一群Java开发者和授权者组成。它的初衷是推动Java技术的演进与更新,包括J2ME、J2SE、J2EE、XML等领域的标准制定。从Sun公司年非正式的Java发展过程,到如今全球数百名Java代表共同监督的正式程序,JCP见证了Java技术的社交源码网站飞跃。想要加入JCP,你可以在Members页面找到相关信息。提交Java规范请求(JSR)是JCP成员推动新技术的重要途径,它们通过严格的评审流程,最终成为Java技术规范的组成部分。 Java Specification Request (JSR) JSR是Java规范请求的简称,是JCP成员提交给委员会的Java技术发展提案。它经历了六个关键阶段:JSR批准、CAFE、参与者审查、公开审查、首个发布和最终发布。在进入Final Release状态前,每一份JSR都需经过公开审议和JCP Executive Committee投票。通过的JSR将提供一个公开源代码的参考实现,并伴有技术兼容工具包(TCK),确保新API与现有规范的兼容性。 常见JSR回顾JSR - 新的Java平台I/O API(J2SE 1.4) - --
JSR - Java编程语言中泛型的添加 - --
JSR - JCACHE:Java临时缓存API - --
JSR - Java内存模型和线程规范修订 - --
JSR - 并发实用工具(J2SE 5.0的java.util.concurrent等) - --
JSR - 新的Java平台I/O API(NIO2) - --
JSR - Java平台通用注解(如@Resource、@PreDestroy、@PostConstruct)- 活跃中
JSR - Java的日期和时间API - --
JSR - Java的依赖注入 - --
JSR - Java编程语言中的lambda表达式 - --
了解这些JSR,不仅是技术上的进步,也是对Java语言深厚历史与未来发展的洞见。它们不仅塑造了Java的基石,也影响着我们每天的编码实践。作为Java开发者,深入理解JCP和JSR,无疑会提升我们的专业素养,赋予代码更深的内涵和价值。Spring框架@PostConstruct注解详解
业务背景:在特定业务场景下,如程序启动时需从数据库加载数据并缓存于内存中,传统的依赖查找实现方法可满足需求,但寻求更优雅解决方案时,@PostConstruct注解应运而生。
@PostConstruct注解的实现:此注解标记的方法会在Spring容器启动时自动执行。实现原理涉及注解功能描述、源码分析以及方法调用流程追溯。
源码分析:@PostConstruct注解的原理核心在于依赖注入完成后的执行。通过CommonAnnotationBeanPostProcessor类的构造方法初始化注解类型,随后在PostProcessMergedBeanDefinition方法中,通过调用父类InitDestroyAnnotationBeanPostProcessor,实现对被@PostConstruct注解方法的调用。此过程中,通过反射机制执行方法。
具体流程:在创建和初始化bean时,执行PostConstructTest实例的生命周期元数据方法,先进行依赖注入检查和属性赋值。当依赖注入完成,调用@PostConstruct注解方法。这一过程在bean属性赋值阶段完成,并在初始化前通过CommonAnnotationBeanPostProcessor调用postProcessBeforeInitialization方法,进一步通过反射执行@PostConstruct注解方法。
总结:@PostConstruct注解在Spring容器刷新创建bean实例时构建生命周期元数据,在此元数据中保存注解方法,确保在属性赋值阶段完成依赖检查与注入。在初始化过程中,执行postProcessBeforeInitialization方法,利用反射机制调用@PostConstruct注解方法,实现特定业务场景下的自动执行。
ApplicationRunner、InitializingBean、@PostConstruct 执行顺序
在Spring Boot开发中,处理容器启动时执行特定操作的场景常见。Spring Boot提供两种接口辅助完成此类需求:`CommandLineRunner` 和 `ApplicationRunner`。两者核心功能相似,但处理参数的方式不同:`CommandLineRunner` 接口的 `run()` 方法接收未处理的原始参数数组;`ApplicationRunner` 的 `run()` 方法则接收封装后的 `ApplicationArguments` 对象。
在应用启动时,通过 `main()` 方法传入的参数能够被实现这两种接口的类的 `run()` 方法访问,允许接收启动服务时的参数。用户可创建多个实现这两种接口的类,并通过 `@Order` 注解或实现 `Ordered` 接口来调整它们执行的顺序。
`ApplicationRunner` 接口示例:启动参数 `java -jar xxxx.jar data1 data2 data3`,运行时显示 `Application started with arguments:data1|data2|data3`。
类同地,`CommandLineRunner` 接口也支持同样格式的启动参数,运行结果相同。
针对执行顺序,Spring Boot在初始化上下文后调用 `SpringApplication` 类的 `callRunners` 方法,获取所有实现 `ApplicationRunner` 和 `CommandLineRunner` 接口的bean,并依序执行 `run` 方法。在同一个线程内执行,若某 `ApplicationRunner` 实现的 `run` 方法进入死循环,后续代码将无法执行。
当实现多个 `ApplicationRunner` 时,仅执行特定的实现,可能是由于 `callRunners` 方法执行顺序或实现间的交互引起。深入分析Spring Boot启动源码可见,`callRunners` 方法在上下文加载完成后调用,依次执行 `run` 方法。
关于 `InitializingBean` 接口,它提供了初始化bean的机制,包含 `afterPropertiesSet` 方法。继承此接口的类在bean初始化时会执行该方法,建议在使用时配合Spring注解注入,如 `@Component`。
`@PostConstruct` 注解则用于在生成对象后完成初始化操作,特别是那些依赖注入后才能执行的初始化。此注解标记的方法会在依赖注入完成后自动调用。优先级顺序为:构造函数 > `@Autowired` > `@PostConstruct`。
`@PostConstruct` 方法执行顺序位于初始化方法 `InitializingBean`、`ApplicationRunner`、`CommandLineRunner` 之后。因此,执行顺序为 `@PostConstruct` > `InitializingBean` > `ApplicationRunner` > `CommandLineRunner`。