这是一个基于 Java 反射技术实现的轻量级 IoC (控制反转) 和 AOP (面向切面编程) 的旅行社行程定制系统模拟。
- IoC 支持:通过
BeanFactory动态加载和配置Vehicle(交通工具) 和Hotel(酒店),无需在代码中硬编码具体实现类。 - AOP 支持:支持在不修改业务代码的情况下,通过
Interceptor(拦截器) 增加额外功能(如:保险购买、自动开票、操作日志)。 - 高扩展性:遵循“开闭原则”,新增交通工具或酒店只需添加类并配置属性,无需改动现有逻辑。
- 选择交通工具:用户从配置的列表中选择(如 Plane, Car, Bus)或选择不使用。
- 选择酒店:用户选择住宿(如 HiltonHotel)或选择不使用。
- 打印行程:系统自动完成资源创建,并在核心业务执行前后触发 AOP 增强逻辑(保险、发票等)。
如果需要增加一种交通工具 Bus:
- 步骤 1:在
com.example.travel包下创建Bus.java实现Vehicle接口。 - 步骤 2:在
src/main/resources/travel.properties的vehicle.options属性后添加该选项:vehicle.options=..., Bus:com.example.travel.Bus - 结果:重新运行程序,交互界面将自动出现
Bus选项,且自动享有通用的拦截器功能。
如果需要为酒店增加一个 LoggerInterceptor 日志功能:
- 步骤 1:创建类
com.example.travel.LoggerInterceptor实现Interceptor接口。 - 步骤 2:在
travel.properties中修改hotel.interceptors:hotel.interceptors=com.example.travel.InvoiceInterceptor,com.example.travel.LoggerInterceptor - 结果:调用酒店的
unPack方法时,会自动先执行日志记录。
- BeanFactory: 负责解析
travel.properties并利用Class.forName().newInstance()进行 IoC 容器模拟。 - AopInvocationHandler: 利用 JDK 动态代理实现
InvocationHandler,对目标对象(Target)的方法调用进行职责链增强。