2016-10-09 3 views
2

Как я могу автоудалить список с помощью java без конфигурации?Autowiring список весной без конфигурации

Скажем, у меня есть следующие классы:

public abstract class A { 
    public abstract doStuff(); 
} 

public class B extends A { 
    @Override 
    public void doStuff() { 
     System.out.println("I'm B"); 
    } 
} 

public class C extends A { 
    @Override 
    public void doStuff() { 
     System.out.println("I'm C"); 
    } 
} 

И у меня есть класс

public class Aggregator { 
    @Autowired 
    private List<A> stuffDoers; 
    private void doAllStuff() { 
     for(A a:stuffDoers) { 
      a.doStuff(); 
     } 
    } 
} 

Как я могу autowire некоторые реализации элементов а в Aggregator без настройки списка в XML?

EDIT: Я ищу способ, чтобы иметь возможность контролировать членов списка

ответ

3

@Autowired всегда работает с экземплярами класса, а не типов. Вы определили 3 типа: A, B и C, но не создали ни одного экземпляра из них.

Для автоустройства вам необходимо создать эти экземпляры, а также зарегистрировать их с помощью Spring. Здесь происходит конфигурация XML или конфиг Java. Это в основном короткая форма для создания экземпляров Spring. Таким образом, вы можете указать:

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 

@Configuration 
public class ApplicationConfiguration { 

    @Bean 
    public B someA() { 
     return new B(); 
    } 

    @Bean 
    public C anotherA() { 
     return new C(); 
    } 

    @Bean 
    public B evenMoreA() { 
     return new B(); 
    } 
} 

Это дает вам 3 независимых экземпляра фасоли (а не список). Для получения дополнительной информации см. Java-based container configuration.

Теперь весна будет выполнять поиск всех бобов типа A в этих пакетах и ​​заполнить ваш класс Aggregator со всеми тремя компонентами.

ПРИМЕЧАНИЕ: Эти бобы не обязательно должны быть в одном файле. Они могут быть объявлены в любом месте вашего пакета @ComponentScan.


Как спросил комментарий, что, если вы хотите иметь только некоторые из этих случаев?

Если вы хотите только , некоторые из фасоль, добавленные в ваш список, ситуация более сложная. Вам нужно будет переместить исключенные компоненты в отдельный класс @Configuration, в другой пакет. Вы не должны добавлять этот новый пакет к пакетам Spring @ComponentScan, поэтому Spring не найдет эти компоненты для добавления в список. Насколько я знаю, это единственный способ.

Конечно, если вы хотите только одну фасоль, то, как обычно, вы должны автоустанавливать ее с помощью @Qualifier и указать имя компонента. В этом случае вы не используете List, а только переменную типа A.

+0

Я спросил, как это сделать без конфигурации, только в java. – aclokay

+0

@ user1050389 ah достаточно справедливо, добавит пример JavaConfig. – metacubed

+0

Вы упомянули, что он дает три независимых компонента, а не список. Будет ли эта работа этими независимыми компонентами быть автоуведомленными как список? В противном случае он не отвечает на вопрос. О.К. Я вижу, что вы ссылались на это. Благодаря! – aclokay

Смежные вопросы