小编Xia*_* Xu的帖子

依赖注入,Scala和Spring

我喜欢DI和松散耦合系统的概念,很多.但是,我发现Spring中的工具最多缺乏.例如,很难进行"重构",例如更改Spring中声明的bean的名称.我是Spring的新手,所以我会遗漏一些东西.没有编译时间检查等.

我的问题是为什么我们要使用XML来存储配置?IMO,Spring(IoC部分)的整个想法是强制某些创造模式.在四人一组模式的世界中,设计模式是信息性的.另一方面,Spring(和其他DI)提供了一种非常规定的方式,应用程序应该如何与各个组件连接.

我已经把Scala放在标题中以及我正在学习它.你们怎么想创建一个领域语言(比如演员库)来依赖摄取.在Scala中编写实际的注入代码,您将获得随附的所有好东西和工具.虽然应用程序开发人员可能会绕过您的框架,但我认为标准相对容易,例如主网站/应用程序只会加载某些模式的组件.

spring dependency-injection scala

15
推荐指数
1
解决办法
8279
查看次数

ScheduledExecutorService生命周期?

我有一个对象需要定期做一些工作,而对象本身是活着的,所以我设计了类似下面的东西.基本上是一个Main类,它包含对ScheduledExecutorService实例的引用.在此示例中,所有定期工作都是将字符串打印到std.

我希望代码的行为如下:

  1. 调用test2,它创建一个Main对象o1(在其中包含ScheduledExecutorService).
  2. test2寄存器在o1上每秒打印一行.
  3. test2返回,o1变成垃圾.
  4. 系统gc启动到gc o1,它有一个finalize方法来关闭它的本地调度程序.

但是,如果我运行这个程序,会发生什么,它会永远发生.基本上gc从不调用o1的终结器,因此,调度程序永远不会关闭,因此,即使主线程结束,程序仍然不会退出.

现在,如果我在test2()中注释掉o1.register,程序的行为就像它应该的那样,例如gc调用等.同样在调试器中,似乎只有在调用ScheduledExecutorService.schedule后才会创建一个实际的线程.

有什么解释发生了什么?

public class Main {

public static void main(String[] args) throws Exception {
    test2();

    System.gc();
    System.out.println("Waiting for finalize to be called..");
    Thread.sleep(5000);
}

private static void test2() throws Exception {
    Main o1 = new Main();
    o1.register();
    Thread.sleep(5000);     
}

private final ScheduledExecutorService _scheduler = Executors.newSingleThreadScheduledExecutor();   

private void register() {
    _scheduler.scheduleWithFixedDelay(new Runnable() { 
        @Override public void run() { 
            System.out.println("!doing stuff...");
            }
        }, 1, 1, TimeUnit.SECONDS);
}

@Override
protected void finalize() throws Throwable  { …
Run Code Online (Sandbox Code Playgroud)

java multithreading daemon executor

4
推荐指数
1
解决办法
4300
查看次数