Spring Auto сканирование компонентов

Компоненты Spring Auto для сканирования

Обычно вы объявляете все компоненты или компоненты в файле конфигурации компонентов XML, чтобы контейнер Spring мог обнаруживать и регистрировать компоненты или компоненты. Фактически, Spring может автоматически сканировать, обнаруживать и создавать экземпляры ваших bean-компонентов из предопределенного пакета проекта, а не утомительного объявления bean-компонентов в XML-файле.

Ниже приведен простой проект Spring, включающий обслуживание клиентов и слой дао. Давайте рассмотрим разницу между объявлением компонентов вручную и автоматическим сканированием компонентов в Spring.

1. Объявляет компоненты вручную

Смотрите нормальный способ объявить бин весной.

Нормальный боб.

package com.example.customer.dao;

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

Слой DAO.

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

}

Файл конфигурации бина (Spring-Customer.xml), нормальная конфигурация бина в Spring.



    
        
    

    

Запустить его

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

    }
}

выход

CustomerService [customerDAO=Hello , This is CustomerDAO]

2. Сканирование автокомпонентов

Теперь включите функции автоматического сканирования компонентов Spring.

Добавьте аннотацию@Component, чтобы указать, что этот класс является компонентом автоматического сканирования.

package com.example.customer.dao;

import org.springframework.stereotype.Component;

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

Слой DAO, добавьте@Component, чтобы указать, что это также компонент автоматического сканирования.

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

Поместите этот «context:component» в файл конфигурации bean-компонента, это означает, что в Spring включите функцию автоматического сканирования. base-package указывает, где хранятся ваши компоненты, Spring просканирует эту папку и найдет bean (помеченный @Component) и зарегистрирует его в контейнере Spring.



    

Запустить его

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

    }
}

выход

CustomerService [customerDAO=Hello , This is CustomerDAO]

Так работает автоматическое сканирование компонентов в Spring.

Пользовательское имя компонента автоматического сканирования

По умолчанию Spring будет нижний регистр первого символа компонента - от «CustomerService» до «customerService». И вы можете получить этот компонент с именем «customerService».

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

Чтобы создать собственное имя для компонента, вы можете поставить собственное имя, например:

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

Теперь вы можете получить его с этим именем «AAA».

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

Типы аннотаций сканирования автокомпонентов

В Spring 2.5 существует 4 типа типов аннотаций сканирования автокомпонентов

  • @Component - обозначает компонент автоматического сканирования.

  • @Repository - указывает компонент DAO на постоянном уровне.

  • @Service - указывает компонент службы на бизнес-уровне.

  • @Controller - указывает компонент контроллера на уровне представления.

Итак, какой из них использовать? Это действительно не имеет значения. Давайте посмотрим исходный код@Repository,@Service или@Controller.

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

    String value() default "";

}

Вы заметите, что все@Repository,@Service или@Controller аннотированы@Component. Итак, можем ли мы использовать только @Component для всех компонентов для автоматического сканирования? Да, вы можете, и Spring автоматически проверит все ваши компоненты с аннотацией @Component.

Это работает нормально, но не является хорошей практикой, для удобства чтения вы должны всегда объявлять @ Repository, @ Service или @Controller для указанного слоя, чтобы сделать ваш код более легким для чтения, как показано ниже:

Слой DAO

package com.example.customer.dao;

import org.springframework.stereotype.Repository;

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

Сервисный уровень

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

}

Скачать исходный код