2013-12-09 2 views
0

Есть ли способ запустить приложение Spring, настроенное аннотацией, непосредственно из основного метода? Я все еще получаю код запуска NullPointerException ниже. Обратите внимание, что я не использую SpringMVC, и когда я использую beans, определенные внутри context.xml, вводимые внутри основного метода методом context.getBean, весь код работает отлично (без ошибок), но мне просто интересно, является ли это способом управлять запуском этого только с аннотациями?Spring - NullPointerException при автоподготовке

//IElem.java 
package com.pack.elem; 
public interface IElem { 
    public abstract String sayHello(); 
} 



//Elem.java 
package com.pack.elem; 
import org.springframework.stereotype.Component; 
@Component 
public class Elem implements IElem{ 
    @Override 
    public String sayHello() { 
     return ("Hello from Elem class object"); 
    } 
} 


//RunElem.java 
package com.pack.elem; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Component; 

@Component 
public class RunElem { 
    @Autowired 
    private IElem elem; 

    public void runHello(){ 
     System.out.println(elem.sayHello()); 
    } 
} 


//Main.java 
package com.pack.main; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import com.pack.elem.RunElem; 

public class Main { 
    @Autowired 
    private RunElem runelem; 

    public static void main(String[] args) { 
     ApplicationContext context= new ClassPathXmlApplicationContext("/META-INF/application-context.xml"); 
    new Main().runRun(); 
    } 

    private void runRun(){ 
     runelem.runHello(); 
    } 
} 


<!--/META-INF/application-context.xml --> 
<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <context:annotation-config/> 
    <context:component-scan base-package="com.pack"/> 
</beans> 
+0

Так что вы ожидаете экземпляр, созданный за пределами весны, который автоматически управляется весной. Вы не должны сами создавать экземпляры, но должны использовать тот, который уже настроен весной. Другими словами, извлеките его из 'ApplicationContext' вместо того, чтобы создавать свои собственные. –

+0

@RakeshGoyal у вас есть право. Это похоже. Я этого раньше не видел. Может быть, это поможет. Благодарю. – kropla

+0

@ M.Deinum теперь для меня ясно. Благодаря! – kropla

ответ

2

Проще говоря, Spring является autowiring, если это экземпляр компонента. Поэтому вы должны использовать getBean(). Если вы хотите использовать только аннотаций, что-то, как это должно работать:

@Component 
public class Main { 
    @Autowired 
    private RunElem runelem; 

    public static void main(String[] args) { 
     ApplicationContext context= new ClassPathXmlApplicationContext("/META-INF/application-context.xml"); 
    Main mainBean = context.getBean(Main.class); 
    mainBean.runRun(); 
    } 

    private void runRun(){ 
     runelem.runHello(); 
    } 
} 

В качестве альтернативы вы можете autowire существующий компонент, как показано ниже, но это не рекомендуется использование Spring:

public class Main { 
    @Autowired 
    private RunElem runelem; 

    public static void main(String[] args) { 
     ApplicationContext context= new ClassPathXmlApplicationContext("/META-INF/application-context.xml"); 
    Main mainBean = new Main(); 
    context.getAutowireCapableBeanFactory().autowireBean(mainBean); 
    mainBean.runRun(); 
    } 

    private void runRun(){ 
     runelem.runHello(); 
    } 
} 
+0

Работает отлично. Благодарю. Теперь для меня это более понятно. – kropla

Смежные вопросы