У меня есть хобби-проект, который я хотел бы перенести на Spring.
В качестве примера у меня есть следующие классы:
public class OtherBean {
public void printMessage() {
System.out.println("Message from OtherBean");
}
}
public class InjectInMe {
@Inject OtherBean otherBean;
public void callMethodInOtherBean() {
otherBean.printMessage();
}
}
Однако, когда я читаю документацию, я должен аннотировать все классы, которыми должен управлять Spring, аннотацией, такой как @Component (или другими подобными).
Запускаем его со следующим кодом:
public class SpringTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh();
InjectInMe bean = context.getBean(InjectInMe.class);
bean.callMethodInOtherBean();
}
}
Выдает мне ошибку:
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [somepackage.InjectInMe] is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
at somepackage.SpringTest.main(SpringTest.java:10)
Мой вопрос: есть ли способ заставить Spring управлять любым классом, который я прошу ApplicationContext создать экземпляр без, чтобы мне пришлось регистрировать их в аннотированной конфигурации (или конфигурации XML)?
В Guice я могу просто ввести в класс
public class GuiceTest {
static public class GuiceConfig extends AbstractModule {
@Override
protected void configure() {}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new GuiceConfig());
InjectInMe bean = injector.getInstance(InjectInMe.class);
bean.callMethodInOtherBean();
}
}
Дает мне вывод:
Message from OtherBean
Могу ли я заставить Spring работать как Guice? Как заставить Spring внедрить мои bean-компоненты без регистрации или сканирования пакетов на наличие классов, аннотированных аннотациями, подобными @Component?
У любого гуру Spring есть способ решить эту проблему?