Konstruktorabhängigkeitspritze im Frühling

Konstruktorabhängigkeitsinjektion im Frühjahr

1. Einführung

Wohl eines der wichtigsten Entwicklungsprinzipien des modernen Software-Designs istDependency Injection (DI), das ganz natürlich aus einem anderen kritisch wichtigen Prinzip hervorgeht:Modularity.

In diesem Artikel wird eine bestimmte Art von DI-Technik mit dem NamenConstructor-Based Dependency Injection in Spring untersucht. Einfach ausgedrückt bedeutet dies, dass die erforderlichen Komponenten zum Zeitpunkt der Instanziierung an eine Klasse übergeben werden.

Um zu beginnen, müssen wir die Abhängigkeit vonspring-contextin unserepom.xml importieren:


    org.springframework
    spring-context
    5.1.4.RELEASE

Dann müssen wir eineConfiguration-Datei einrichten. Diese Datei kann entweder ein POJO oder eine XML-Datei sein.

Weitere Lektüre:

Einführung in die Inversion von Control und Dependency Injection mit Spring

Eine kurze Einführung in die Konzepte von Inversion of Control und Dependency Injection, gefolgt von einer einfachen Demonstration mit dem Spring Framework

Read more

Fragen im Vorstellungsgespräch bei Top Spring Framework

Eine kurze Diskussion über häufig gestellte Fragen zum Spring Framework, die während eines Vorstellungsgesprächs auftreten können.

Read more

Verkabelung im Frühjahr: @Autowired, @Resource und @Inject

In diesem Artikel wird die Verwendung von Annotationen im Zusammenhang mit der Abhängigkeitsinjektion verglichen und gegenübergestellt, nämlich die Annotationen @Resource, @Inject und @Autowired.

Read more

2. Anmerkungsbasierte Konfiguration

Die Java-Konfigurationsdatei ähnelt in etwa einem einfachen Java-Objekt mit einigen zusätzlichen Anmerkungen:

@Configuration
@ComponentScan("com.example.constructordi")
public class Config {

    @Bean
    public Engine engine() {
        return new Engine("v8", 5);
    }

    @Bean
    public Transmission transmission() {
        return new Transmission("sliding");
    }
}

Hier verwenden wir Annotationen, um Spring Runtime zu benachrichtigen, dass diese Klasse ein Anbieter von Bean-Definitionen ist (@Bean Annotation) und dass ein Kontext-Scan nach zusätzlichen Beans in Paketcom.example.spring durchgeführt werden muss. Als nächstes definieren wir dieCar-Klasse:

@Component
public class Car {

    @Autowired
    public Car(Engine engine, Transmission transmission) {
        this.engine = engine;
        this.transmission = transmission;
    }
}

Spring trifft beim Ausführen eines Paket-Scans auf die KlasseCarund initialisiert ihre Instanz durch Aufrufen des mit Anmerkungen versehenen Konstruktors@Autowired.

Instanzen vonEngine and Transmission werden durch Aufrufen der mit Anmerkungen versehenen Methoden von@Beander KlasseConfig erhalten. Schließlich müssen wir einApplicationContext mit unserer POJO-Konfiguration booten:

ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Car car = context.getBean(Car.class);

3. Implizite Konstruktorinjektion

Ab Spring 4.3 können Klassen mit einem einzelnen Konstruktor die Annotation@Autowiredweglassen. Ein schönes Stückchen Bequemlichkeit und Kesselplattenentfernung!

Darüber hinaus kann auch ab 4.3 die konstruktorbasierte Injektion in@Configuration annotierten Klassen eingesetzt werden. Und ja, wenn eine solche Klasse nur einen Konstruktor hat, kann auch die Annotation@Autowiredweggelassen werden.

4. XML-basierte Konfiguration

Eine andere Möglichkeit, die Spring-Laufzeit mit der konstruktorbasierten Abhängigkeitsinjektion zu konfigurieren, ist die Verwendung einer XML-Konfigurationsdatei:


    
    



    
    



    

Beachten Sie, dassconstructor-arg einen Literalwert oder einen Verweis auf eine andere Bean akzeptieren kann und dass optional expliziteindex undtype bereitgestellt werden können. Die AttributeType undindex können zum Auflösen von Mehrdeutigkeiten verwendet werden (z. B. wenn ein Konstruktor mehrere Argumente desselben Typs verwendet).

Das Attributname kann auch für den Abgleich von XML- zu Java-Variablen verwendet werden, aber dann wird Ihr Codemust mit aktiviertem Debug-Flag kompiliert.

In diesem Fall muss ein Spring-Anwendungskontext mitClassPathXmlApplicationContext gebootet werden:

ApplicationContext context = new ClassPathXmlApplicationContext("example.xml");
Car car = context.getBean(Car.class);

5. Fazit

In diesem kurzen Tutorial wurden die Grundlagen von zwei verschiedenen Möglichkeiten zur Verwendung vonConstructor-Based Dependency Injection mithilfe des Spring-Frameworks vorgestellt.

Diefull implementation dieses Tutorials finden Sie unterover on Github.