it-swarm.com.de

Verwenden von Spring 3 Autowire in einer eigenständigen Java Anwendung

Hier ist mein Code:

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>

Warum funktioniert das nicht? Ich bekomme NullPointerException. Ist es möglich, Autowiring in einer eigenständigen Anwendung zu verwenden?

68
mike27

Frühling arbeitet in der allein stehenden Anwendung. Sie verwenden den falschen Weg, um eine Springbohne zu erstellen. So geht das richtig:

@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";
    }
}

Im ersten Fall (der in der Frage) erstellen Sie das Objekt selbst, anstatt es aus dem Spring-Kontext abzurufen. Spring hat also keine Chance, die Abhängigkeiten zu Autowire (was die NullPointerException verursacht).

Im zweiten Fall (der in dieser Antwort) erhalten Sie die Bean aus dem Spring-Kontext, und daher wird sie von Spring verwaltet, und Spring kümmert sich um autowiring.

127
Abhinav Sarkar

Spring entfernt sich von XML-Dateien und verwendet häufig Anmerkungen. Das folgende Beispiel ist eine einfache eigenständige Spring-Anwendung, die Annotation anstelle von XML-Dateien verwendet.

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;
   }
}

Dies ist eine einfache Bohne. Es ist mit dem @Component Anmerkung zur automatischen Erkennung durch den Spring-Container.

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());
    }
}

Dies ist die Hauptklasse Application. Das @ComponentScan Annotation sucht nach Komponenten. Das @Autowired Annotation fügt die Bean in die Variable message ein. Das AnnotationConfigApplicationContext wird verwendet, um den Spring-Anwendungskontext zu erstellen.

In meinem Tutorial zu Standalone Spring wird gezeigt, wie eine eigenständige Spring-Anwendung sowohl mit XML als auch mit Anmerkungen erstellt wird.

20
Jan Bodnar

Für Spring 4 können wir mit Spring Boot das folgende Beispiel verwenden, ohne das Anti-Pattern zum direkten Abrufen der Bean aus dem ApplicationContext zu verwenden:

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";
    }
}

Stellen Sie sicher, dass alle Ihre injizierten Dienste unter com.yourproject oder seine Unterpakete.

10