2013-03-06 7 views
3

Весной через класс ApplicationContext я могу использовать функции IoC и получить ссылку на боб следующегоSpring IoC и Java EE

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. Мой вопрос: как загрузить функции IoC в автономное приложение с использованием Java EE?

EDIT Спасибо за помощь, ребята ... Я пошел с внедрением CDI OpenWebBeans ... Спасибо за помощь.

ответ

2

В настоящее время вы работаете с JNDI, а не с IoC.

Если вы хотите, чтобы JNDI работал в автономном приложении для поиска удаленных данных Google для «jndi client».

Если вы хотите использовать IoC в приложении Java EE - проверить CDI

0

Если вам нужно получить 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 
} 
+0

Привет, спасибо за ответ. Я пробовал это, но он все еще бросает исключение именования. «Необходимо указать имя класса в среде или системном свойстве или в качестве параметра апплета». – Barry

+0

@Barry. В этом случае я боюсь, что вам нужно реализовать 'javax.naming.spi.InitialContextFactory' и поместить его в свойства System. Что-то совсем подобное я представил в обновленном ответе. – n1ckolas

0

CDI является весна «эквивалент "в java EE 6
(на самом деле это не эквивалентно, потому что он охватывает только функции контекста и DI, другие - другую реализацию JSR, такую ​​как EJB или JPA, но если ваша проблема заключается только в использовании DI, то она будет идеально вписываться. Однако вы не сможете использовать другие функции Spring/Java EE, такие как транзакция, управляемая контейнером)
Если вы хотите запустить ее в автономном приложении, перейдите на реализацию Jboss WELD CDI.

Лично я думаю, что это Фарли лучше, чем весной для контекста и управления DI, но здесь не место для троллинга