使用 Spring 设计 Java 库
我正在将现有程序中的一些功能提取到一个单独的库中。该程序使用Spring进行依赖注入和其他任务,我也想继续在库中使用它。
这个库需要监视文件系统的更改,因此它将启动某种单独的线程来执行此操作。
我真的不知道我初始化库的选项是什么:
如何初始化库的上下文?我不能假设图书馆用户也会使用Spring,但我可以与图书馆一起分发Spring。
如何管理文件系统监控线程?期望程序实例化库的主类和调用 init 或类似的东西是好的设计吗?
我正在将现有程序中的一些功能提取到一个单独的库中。该程序使用Spring进行依赖注入和其他任务,我也想继续在库中使用它。
这个库需要监视文件系统的更改,因此它将启动某种单独的线程来执行此操作。
我真的不知道我初始化库的选项是什么:
如何初始化库的上下文?我不能假设图书馆用户也会使用Spring,但我可以与图书馆一起分发Spring。
如何管理文件系统监控线程?期望程序实例化库的主类和调用 init 或类似的东西是好的设计吗?
如何初始化库的上下文?我不能假设图书馆用户也会使用Spring,但我可以与图书馆一起分发Spring。
我也在使用Spring上下文编写一个库,我做了类似的事情,假设你的库叫做FooLib,有两个名为FooService和BarService的服务,还有一个名为SpringContext的类,它通过java配置来配置你的spring上下文:
public final class FooLib {
private static ApplicationContext applicationContext;
private FooLib() {
}
public static FooService getFooService() {
return getApplicationContext().getBean(FooService.class);
}
public static BarService getBarService() {
return getApplicationContext().getBean(BarService.class);
}
private static ApplicationContext getApplicationContext() {
if (applicationContext == null) {
applicationContext = new AnnotationConfigApplicationContext(SpringContext.class);
}
return applicationContext;
}
}
然后,客户端可以使用以下方式:BarService
BarService barService = FooLib.getBarService();
如何管理文件系统监控线程?期望程序实例化库的主类和调用 init 或类似的东西是好的设计吗?
您可以在Spring上下文中静态启动监视子系统,例如,在SpringContext类中。
@Configuration
@ComponentScan(basePackages = "com.yourgroupid.foolib")
public class SpringContext {
@Bean
public MonitoringSystem monitoringSystem() {
MonitoringSystem monitoringSystem = new MonitoringSystem();
monitoringSystem.start();
return monitoringSystem;
}
}
这应该足够了,因为默认情况下,Spring急切地创造了它的豆子。
干杯
如何初始化库的上下文?我不能假设图书馆用户也会使用Spring,但我可以与图书馆一起分发Spring。
这取决于您的库,以您需要的方式实例化春天。这通常是在您的接口入口点中完成的,该入口点委托给例程,例如,配置spring。样本可以是ClassPathXmlApplicationContext
public class SpringContextLoader {
private static ApplicationContext ctx = null;
public static void init() {
if (ctx == null) {
ctx = ClassPathXmlApplicationContext("classpath:/applicatonContext.xml");
}
}
}
如何管理文件系统监控线程?期望程序实例化库的主类和调用 init 或类似的东西是好的设计吗?
在这种情况下,您可能会提供一个非守护进程线程,例如,必须手动终止才能使应用程序干净退出的线程。因此,您应该提供和机制。在你的情况下,这些可能最好被调用和(因为我猜你想将文件系统事件传递给客户端......另一种选择可能是将石英
调度与弹簧一起使用。start
stop
registerEventListener
unregisterAllEventListener