Spring Как автоматически подключить компонент без использования @Component или других производных

#java #spring

#java #spring

Вопрос:

Я хотел бы автоматически подключить компонент (все еще используя аннотацию @Autowired), но не требовать, чтобы на нем был @Component (или другие подобные аннотации). Как бы мне это сделать?

 public class A {

    @Autowired
    private class B b;

}

@Component
public class B {

}
 

Это было бы удобно для того, чтобы разрешить автоматическое подключение класса A, не требуя создания A, если только нам это не нужно (в противном случае на лету путем отражения с использованием имени класса).

Комментарии:

1. Я не понимаю вашего последнего предложения. Пожалуйста, уточните.

2. Похоже, что вы действительно хотите либо @Profile или @Conditional .

Ответ №1:

Впрыск и автоматическое подключение не требуются @Component . Им нужны бобы. @Component указывает, что аннотированный тип должен иметь сгенерированный для него компонент. Вы можете определить компоненты другими способами: с помощью <bean> объявления в конфигурации контекста XML, с @Bean помощью метода в @Configuration классе и т.д.

Ваше последнее предложение не имеет особого смысла. Вы не можете обрабатывать цели внедрения в компоненте, не создав компонент. Вы также не можете ввести компонент, не создав его. (Применительно к областям, компонент может ссылаться на целевой источник / прокси, а не на фактический экземпляр.) Возможно, вы хотите @Lazy .

Комментарии:

1. Вероятно, этот вопрос возникает из среды внедрения Guice: там вы МОЖЕТЕ вводить компоненты без какой-либо предварительной настройки на пути создания компонента. Т.Е. Если у вас есть компонент с конструктором по умолчанию — вы можете ввести его с помощью аннотации Inject. Вам не нужно создавать конфигурацию с «create that bean» или размещать аннотацию «component» на компоненте, который участвует в DI. Это справедливо только для компонентов с конструкторами по умолчанию.

2. @MiamiBeach возможно ли это весной?

Ответ №2:

Я не уверен, правильно ли я понял ваш вопрос. Но если вы хотите ввести компонент B без маркировки компонента A с помощью какой-либо аннотации или определения xml, вы можете использовать SpringBeanAutowiringSupport

 public class A {

    @Autowired
    private class B b;

    public A{
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    }

}
 

Комментарии:

1. Это то, что я искал, за вычетом одного предостережения. Я знал, какой класс мне нужен, чтобы экземпляр был создан и автоматически подключен. Однако, если бы конструктор класса имел аннотацию @Autowired, я бы не смог создать экземпляр конструктора без извлечения необходимых компонентов. Я надеялся, что есть вызов, который я мог бы сделать, который сделает всю эту работу за меня. Но этот ответ идеально подходит для того, что мне нужно в данный момент.