Почему следующее не работает для autowired

#spring

#spring

Вопрос:

У меня есть класс, подобный

 class A {
      @Autowired
      B b;
}

A a = new A()
  

Я обнаружил, что b это не автозаполнение

Я уже сделал <context:component-scan base-package="*"> , чего-нибудь еще не хватает?

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

1. есть ли какие-либо примечания к определению класса B?

Ответ №1:

Вы должны получить компонент из bean factory, вместо того, чтобы создавать экземпляр напрямую.

Например, вот как это сделать с помощью аннотаций. Во-первых, вам нужно добавить немного больше к вашему объявлению вашего класса:

 // Annotate to declare this as a bean, not just a POJO
@Component
class A {
    @Autowired
    B b;
}
  

Далее вы делаете это один раз для каждого приложения:

 AnnotationConfigApplicationContext factory =
        new AnnotationConfigApplicationContext();
factory.register(A.class);
factory.register(B.class);
// Plus any other classes to register, or use scan(packages...) method
factory.refresh();
  

Наконец, теперь вы можете получать экземпляры компонента:

 // Instead of: new A()
A a = factory.getBean(A.class);
  

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

1. Я отмечаю, что вы также используете конфигурацию XML. Все в порядке; просто получите контекст приложения (который также является bean factory) и используйте его getBean методы.

Ответ №2:

Spring автоматически подключит A объект только в том случае, если Spring создает его экземпляр как компонент. если вы создаете свой собственный экземпляр, Spring ничего об этом не знает, поэтому ничего не подключается автоматически.