使用javascript实现Java的DI和AOP

09-09-27 banq
              

一般我们要使用Spring或Guice等框架来实现,我们会发现使用Annotation或XML来进行注射方面的配置有时已经好像相当于编程了,最近google特地推出一个基于JVM的缺省带DI机制的语言NOOP,那么,其实基于JDK6.0的使用Javascript也可以实现DI依赖注入和AOP功能。

最近老外一篇牛逼对牛逼抛出这篇文章Using Javascript as DI Container in Java

假设有代码如下:

package dao;

public interface BooksDAO {
    public int count();
}
<p>

这是Dao的实现:

package dao;

public class MockBooksDAO implements BooksDAO {

    @Override
    public int count() {
        return 500;
    }
}
<p>

下面是使用Dao的Service

package service;

public interface LibraryService {

    public abstract int countBooks();

}
<p>

这个Service的实现:

public class MockLibraryService implements LibraryService {
    private BooksDAO booksDAO;
    public MockLibraryService(BooksDAO booksDAO) {
        this.booksDAO = booksDAO;
        this.membersDAO = membersDAO;
    }

    public int countBooks() {
        System.out.println("In countBooks()");
        return booksDAO.count();
    }
}
<p>

创建一个Javascript脚本,类似XML或注解,来实现将Dao实现类注射入Service:

src/objects.js

importPackage(Packages.dao)
importPackage(Packages.service)
importPackage(Packages.interceptor)

daos = {
 booksDAO : new MockBooksDAO(),
}

services = {
 libraryService : LoggingInterceptor.getProxy(new MockLibraryService(daos.booksDAO))
}
<p>

客户端调用代码:

package app;

import javax.script.ScriptEngine;
import javax.script.ScriptException;

import service.LibraryService;
import util.ScriptEngineBuilder;

public class Main {
    public static void main(String[] args) throws ScriptException {
        ScriptEngine engine = new ScriptEngineBuilder("js").add("/objects.js").build();

        LibraryService service = (LibraryService) engine.eval("services.libraryService");
        System.out.println("Found " + service.countBooks() + " Members!");
    }
}

<p>

应用代码是从Javascript中获得服务的实例的,这和我们从Spring或Guice Jdon等框架中获得服务实例的思路是一样的。

当然,我们也可以实现AOP的MIXIN功能。具体见原文(要翻墙,鲜花和牛粪都被挡住了)

http://tuxychandru.blogspot.com/2009/08/using-javascript-as-di-container-in.html

[该贴被banq于2009-09-27 10:44修改过]

              

1
zwj0916
2009-09-28 15:03

//个人觉得js 应该这么写 才能跑的通

importPackage(Packages.dao)

importPackage(Packages.service)

daos = {

booksDAO : new MockBooksDAO()

}

services = {

libraryService :new MockLibraryService(daos.booksDAO)

}

测试工程

[该贴被zwj0916于2009-09-28 15:12修改过]

hantsy
2009-10-28 13:55

相当于dwr或者seam javascript功能的一个扩展应用。

lfy9608110935
2009-11-15 21:31

您好

看您写的JS实现类似Spring的DI

麻烦你告诉我ScriptEngineBuilder这个类是需下载哪个jar包

非常感谢

我的qq:38390466

email:lfy9608110935@126.com