2010-09-07 5 views
56

Вот мой код:Использование Spring 3 autowire в автономной Java приложение

public class Main { 

    public static void main(String[] args) { 
     Main p = new Main(); 
     p.start(args); 
    } 

    @Autowired 
    private MyBean myBean; 
    private void start(String[] args) { 
     ApplicationContext context = 
      new ClassPathXmlApplicationContext("META-INF/config.xml"); 
     System.out.println("my beans method: " + myBean.getStr()); 
    } 
} 

@Service 
public class MyBean { 
    public String getStr() { 
     return "string"; 
    } 
} 

<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-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="mypackage"/> 
</beans> 

Почему это не работает? Я получаю NullPointerException. Можно ли использовать автоувеличивание в автономном приложении?

+0

Приложите некоторое усилие, чтобы сделать ваш вопрос понятным. И покажите нам трассировку стека исключений. – skaffman

+0

Я поддерживаю рабочий пример здесь: http://tshikatshikaaa.blogspot.com/2012/08/spring-ioc-container-with-annotations.html – JVerstry

ответ

118

Весна работает в автономном режиме. Вы используете неправильный способ создания весеннего боба. Правильный способ сделать это следующим образом:

@Component 
public class Main { 

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

     Main p = context.getBean(Main.class); 
     p.start(args); 
    } 

    @Autowired 
    private MyBean myBean; 
    private void start(String[] args) { 
     System.out.println("my beans method: " + myBean.getStr()); 
    } 
} 

@Service 
public class MyBean { 
    public String getStr() { 
     return "string"; 
    } 
} 

В первом случае (один в вопросе), вы создаете объект самостоятельно, а не получать его из контекста Spring. Поэтому Spring не получает возможности Autowire зависимостей (что вызывает NullPointerException).

Во втором случае (в этом ответе) вы получаете компонент из контекста Spring и, следовательно, управляете Spring, а Spring заботится о autowiring.

+0

Разве @Autowired стратегия олл-ин? Либо весна управляет _all_ созданием объекта none, но вы не можете добавить @Autowired в некоторые поля в вашем стоп-металле и создать их с помощью new ..(). – Cojones

+0

Если только один объект в вашем callstack создан с помощью нового ..(), он не будет работать правильно? – Cojones

+2

@Cojones, вы можете autowire некоторые бобы и создавать другие с новыми, иначе как бы вы когда-нибудь могли бы назвать 'new ArrayList()', например? Если у вас есть класс с автоуровневыми параметрами и вы создаете его с помощью 'new', то автоустановка не состоится. – Paul

12

Spring отходит от файлов XML и сильно использует аннотации. Следующий пример - это простое автономное приложение Spring, которое использует аннотацию вместо XML-файлов.

package com.zetcode.bean; 

import org.springframework.stereotype.Component; 

@Component 
public class Message { 

    private String message = "Hello there!"; 

    public void setMessage(String message){ 

     this.message = message; 
    } 

    public String getMessage(){ 

     return message; 
    } 
} 

Это простой боб. Он украшен аннотацией @Component для автоматического обнаружения весенним контейнером.

package com.zetcode.main; 

import com.zetcode.bean.Message; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.ComponentScan; 

@ComponentScan(basePackages = "com.zetcode") 
public class Application { 

    public static void main(String[] args) { 

     ApplicationContext context 
       = new AnnotationConfigApplicationContext(Application.class); 

     Application p = context.getBean(Application.class); 
     p.start(); 
    } 

    @Autowired 
    private Message message; 
    private void start() { 
     System.out.println("Message: " + message.getMessage()); 
    } 
} 

Это основной класс Application. Аннотации @ComponentScan ищут компоненты. Аннотации @Autowired впрыскивают компонент в переменную message. AnnotationConfigApplicationContext используется для создания контекста приложения Spring.

My Standalone Spring tutorial показывает, как создать автономное приложение Spring с XML и аннотациями.

0

Для весны 4, используя Spring бутс мы можем иметь следующий пример без использования антишаблона получения Бин из ApplicationContext непосредственно:

package com.yourproject; 

@SpringBootApplication 
public class TestBed implements CommandLineRunner { 

    private MyService myService; 

    @Autowired 
    public TestBed(MyService myService){ 
     this.myService = myService; 
    } 

    public static void main(String... args) { 
     SpringApplication.run(TestBed.class, args); 
    } 

    @Override 
    public void run(String... strings) throws Exception { 
     System.out.println("myService: " + MyService); 
    } 

} 

@Service 
public class MyService{ 
    public String getSomething() { 
     return "something"; 
    } 
} 

Убедитесь, что все введенные услуги под com.yourproject или его подпакеты.

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

  • Нет связанных вопросов^_^