[英]Spring IoC and Java EE
在Spring中,通过ApplicationContext类,我可以利用IoC功能并获得对bean的引用,如下所示
public class Driver {
public static void main(String args[])
{
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring-config.xml");
MyClass myClass = (MyClass)applicationContext.getBean("myClass");
}
我希望能够对Java EE做同样的事情,但我似乎无法在应用程序服务器之外。
我正在尝试以下方法
public class Driver {
public static void main(String args[])
{
InitialContext ic;
try {
ic = new InitialContext();
// JNDI lookup
MyClass myClass = (MyClass)ic.lookup("java:module/MyClass");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
到目前为止,通过这种方法,我得到了一个javax.naming.NoInitialContextException。 我的问题是如何在使用Java EE的独立应用程序中加载IoC功能?
编辑感谢帮助人...我参加了OpenWebBeans CDI实施...感谢您的帮助。
如果需要在Web容器或应用程序服务器之外获取JNDI资源,那么在 lookup
之前需要绑定资源。 但在绑定之前,您需要实现并注册javax.naming.spi.InitialContextFactory
实现。
以最简单的方式,我建议将所有绑定保存在全局java.util.concurrent.ConcurrentHashMap
。 所以它应该如下所示(请记住,这是最简单的解决方案,在某些情况下它可能无法正常工作,但它满足您的特定请求):
public class Driver {
//static initializtion
static {
//registering you custom InitialContextFactory
//note, that you can register it in some other way, check http://docs.oracle.com/javase/jndi/tutorial/beyond/env/source.html
System.setProperty("java.naming.factory.initial", SimpleInitialContextFactory.class.getName());
bindMyClass();
}
private static void bindMyClass(){
try {
InitialContext context = new InitialContext();
context.bind("java:module/MyClass", new MyClass());
} catch (NamingException ignored) {}
}
public static void main(String args[]) throws Exception {
InitialContext ic = new InitialContext();
// JNDI lookup
MyClass myClass = (MyClass)ic.lookup("java:module/MyClass");//should find it
}
}
class SimpleInitialContextFactory implements InitialContextFactory {
@Override
public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
return new MapBasedContext(environment);
}
}
public class MapBasedContext implements Context {
//actual holder of context
private static Map values = new ConcurrentHashMap();
public MapBasedContext() {
}
public MapBasedContext(Hashtable<?, ?> environment) {
values.putAll(environment);
}
@Override
public void bind(String name, Object obj) throws NamingException {
values.put(name, obj);
}
@Override
public Object lookup(String name) throws NamingException {
return values.get(name); //you may throw an exception in case if name is absent
}
//TODO everything else should be implemented, but actual methods bodies aren't required
}
CDI是java EE 6中的“等效”弹簧
(实际上它并不等同,因为它只涵盖了Context和DI功能,其他一个被EJB或JPA等其他JSR实现覆盖,但是如果你的问题只是使用DI那么它将完全适合。你将无法但是要使用其他spring / Java EE功能,例如Container托管事务)
如果要在独立应用程序中运行它,请继续使用Jboss WELD CDI实现。
就个人而言,我认为这对于Context和DI管理来说远胜于春天,但这里不是巨魔的地方
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.