Spring Auto-Scannen von Komponenten

Spring Auto-Scan-Komponenten

Normalerweise deklarieren Sie alle Beans oder Komponenten in der XML-Bean-Konfigurationsdatei, damit der Spring-Container Ihre Beans oder Komponenten erkennen und registrieren kann. Tatsächlich ist Spring in der Lage, Ihre Beans anhand eines vordefinierten Projektpakets automatisch zu scannen, zu erkennen und zu instanziieren.

Das folgende ist ein einfaches Frühlingsprojekt, einschließlich eines Kundendienstes und einer Dao-Schicht. Lassen Sie uns den Unterschied zwischen dem manuellen Deklarieren von Komponenten und dem automatischen Scannen von Komponenten in Spring untersuchen.

1. Deklariert Komponenten manuell

Sehen Sie sich einen normalen Weg an, um eine Bohne im Frühjahr zu deklarieren.

Normale Bohne.

package com.example.customer.dao;

public class CustomerDAO
{
    @Override
    public String toString() {
        return "Hello , This is CustomerDAO";
    }
}

DAO-Schicht.

package com.example.customer.services;

import com.example.customer.dao.CustomerDAO;

public class CustomerService
{
    CustomerDAO customerDAO;

    public void setCustomerDAO(CustomerDAO customerDAO) {
        this.customerDAO = customerDAO;
    }

    @Override
    public String toString() {
        return "CustomerService [customerDAO=" + customerDAO + "]";
    }

}

Bean-Konfigurationsdatei (Spring-Customer.xml), eine normale Bean-Konfiguration im Frühjahr.



    
        
    

    

Starte es

package com.example.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.customer.services.CustomerService;

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext context =
          new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});

        CustomerService cust = (CustomerService)context.getBean("customerService");
        System.out.println(cust);

    }
}

Ausgabe

CustomerService [customerDAO=Hello , This is CustomerDAO]

2. Automatisches Scannen von Komponenten

Aktivieren Sie jetzt die Funktionen zum automatischen Scannen von Komponenten von Spring.

Kommentieren Sie mit@Component, um anzuzeigen, dass es sich bei dieser Klasse um eine Auto-Scan-Komponente handelt.

package com.example.customer.dao;

import org.springframework.stereotype.Component;

@Component
public class CustomerDAO
{
    @Override
    public String toString() {
        return "Hello , This is CustomerDAO";
    }
}

DAO-Ebene, fügen Sie@Component hinzu, um anzuzeigen, dass dies auch eine Auto-Scan-Komponente ist.

package com.example.customer.services;

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

import com.example.customer.dao.CustomerDAO;

@Component
public class CustomerService
{
    @Autowired
    CustomerDAO customerDAO;

    @Override
    public String toString() {
        return "CustomerService [customerDAO=" + customerDAO + "]";
    }
}

Fügen Sie dieses "context:component" in die Bean-Konfigurationsdatei ein. Dies bedeutet, dass die automatische Scanfunktion im Frühjahr aktiviert wird. Diebase-package geben an, wo Ihre Komponenten gespeichert sind. Spring scannt diesen Ordner und findet die Bean (mit @Component kommentiert) heraus und registriert sie im Spring-Container.



    

Starte es

package com.example.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.customer.services.CustomerService;

public class App
{
    public static void main( String[] args )
    {
        ApplicationContext context =
           new ClassPathXmlApplicationContext(new String[] {"Spring-AutoScan.xml"});

        CustomerService cust = (CustomerService)context.getBean("customerService");
        System.out.println(cust);

    }
}

Ausgabe

CustomerService [customerDAO=Hello , This is CustomerDAO]

So funktioniert das automatische Scannen von Komponenten im Frühjahr.

Name der benutzerdefinierten Auto-Scan-Komponente

Standardmäßig schreibt Spring das erste Zeichen der Komponente in Kleinbuchstaben - von "CustomerService" bis "customerService". Und Sie können diese Komponente mit dem Namen "customerService" abrufen.

    CustomerService cust = (CustomerService)context.getBean("customerService");

Um einen benutzerdefinierten Namen für die Komponente zu erstellen, können Sie einen benutzerdefinierten Namen wie folgt eingeben:

@Service("AAA")
public class CustomerService
...

Jetzt können Sie es mit diesem Namen "AAA" abrufen.

    CustomerService cust = (CustomerService)context.getBean("AAA");

Scananmerkungstypen für automatische Komponenten

In Spring 2.5 gibt es 4 Arten von Scananmerkungen für Autokomponenten

  • @Component - Zeigt eine Auto-Scan-Komponente an.

  • @Repository - Gibt die DAO-Komponente in der Persistenzschicht an.

  • @Service - Gibt eine Servicekomponente in der Business-Schicht an.

  • @Controller - Zeigt eine Controller-Komponente in der Präsentationsebene an.

Also, welches soll man verwenden? Es ist wirklich egal. Sehen Sie sich den Quellcode von@Repository,@Service oder@Controller an.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Repository {

    String value() default "";

}

Sie werden feststellen, dass alle@Repository,@Service oder@Controller mit@Component versehen sind. Können wir also nur @Component für alle Komponenten zum automatischen Scannen verwenden? Ja, Sie können und Spring scannt automatisch alle Ihre Komponenten mit @Component-Annotation.

Es funktioniert einwandfrei, ist jedoch keine gute Vorgehensweise. Aus Gründen der Lesbarkeit sollten Sie für eine bestimmte Ebene immer @ Repository, @ Service oder @Controller deklarieren, um die Lesbarkeit des Codes zu verbessern.

DAO-Schicht

package com.example.customer.dao;

import org.springframework.stereotype.Repository;

@Repository
public class CustomerDAO
{
    @Override
    public String toString() {
        return "Hello , This is CustomerDAO";
    }
}

Service-Schicht

package com.example.customer.services;

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

import com.example.customer.dao.CustomerDAO;

@Service
public class CustomerService
{
    @Autowired
    CustomerDAO customerDAO;

    @Override
    public String toString() {
        return "CustomerService [customerDAO=" + customerDAO + "]";
    }

}

Quellcode herunterladen