#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, я бы не смог создать экземпляр конструктора без извлечения необходимых компонентов. Я надеялся, что есть вызов, который я мог бы сделать, который сделает всю эту работу за меня. Но этот ответ идеально подходит для того, что мне нужно в данный момент.