一般我们要使用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修改过]