3

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の実装に行きました...助けてくれてありがとう。

4

3 に答える 3

2

現在、IoC ではなくJNDIを使用しています。

JNDI をスタンドアロン アプリケーションで使用して、"jndi クライアント" のリモート データ Google を検索する場合。

Java EE アプリケーションで IoC を使用する場合は、CDIを確認してください

于 2013-03-06T11:25:38.497 に答える
0

CDIは、Java EE 6の春の「同等」です
(実際には、コンテキストとDI機能のみをカバーしているため、同等ではありません。他のCDIは、EJBやJPAなどの他のJSR実装でカバーされていますが、問題がDIのみを使用する場合は完全に適合します。ただし、他のSpring / Java EE機能(たとえば、コンテナー管理トランザクションなど)を使用することはできません)
スタンドアロンアプリケーションで実行する場合は、JbossWELDCDI実装に進みます。

個人的には、コンテキストとDIの管理には春よりもはるかに良いと思いますが、ここはトロールする場所ではありません

于 2013-03-06T15:05:40.463 に答える
0

Webコンテナまたはアプリケーションサーバーの外部でJNDIリソースを取得する必要がある場合は、リソースをバインドする前に . ただし、バインドする前に、実装を実装して登録する必要があります。lookupjavax.naming.spi.InitialContextFactory

最も簡単な方法として、すべてのバインディングを global に保持することをお勧めします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
}
于 2013-03-06T11:27:07.727 に答える