Использование Spring 3 AutoWire в автономном приложении Java - PullRequest
66 голосов
/ 07 сентября 2010

Вот мой код:

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.Можно ли использовать автопроводку в автономном приложении?

Ответы [ 3 ]

125 голосов
/ 07 сентября 2010

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

@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.

20 голосов
/ 07 декабря 2016

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 для автоопределения контейнером Spring.

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 Автономное руководство Spring показывает, как создать отдельное приложение Spring с XML и аннотациями.

9 голосов
/ 15 января 2017

Для Spring 4, используя Spring Boot, у нас может быть следующий пример без использования анти-паттерна получения Bean из 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 или его подпакетами.

...