使用javascript实现Java的DI和AOP

一般我们要使用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();
}

这是Dao的实现:

package dao;

public class MockBooksDAO implements BooksDAO {

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

下面是使用Dao的Service


package service;

public interface LibraryService {

public abstract int countBooks();

}

这个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();
}
}

创建一个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))
}

客户端调用代码:


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!");
}
}

应用代码是从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修改过]

//个人觉得js 应该这么写 才能跑的通
importPackage(Packages.dao)
importPackage(Packages.service)

daos = {
booksDAO : new MockBooksDAO()
}

services = {
libraryService :new MockLibraryService(daos.booksDAO)
}

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

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

您好

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

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

非常感谢

我的qq:38390466
email:lfy9608110935@126.com