Важно помнить, что Spring может вставлять ссылки только в управляемые bean-компоненты Spring.В вашем коде вы ожидаете, что Spring внедрит экземпляр UserService
в ваш Action
класс.Spring должен правильно выполнять эту инъекцию в bean-компонент Spring с именем usergui
, однако в пользовательском интерфейсе вы создаете свой собственный экземпляр класса Action
со следующим кодом:
loginButton.addActionListener(new Action());
Каждый раз, когда вы создаетеэкземпляр Object, он не будет управляться Spring и должен обрабатываться так же, как любой другой объект, управляемый самостоятельно, т. е. устанавливать все необходимые ссылки вручную.
Чтобы получить ожидаемый результат, вам необходимо изменить логику пользовательского интерфейса для ссылки на bean-компонент Spring usergui
, который вы определили в своем файле конфигурации.Чтобы получить этот экземпляр, сначала нужно получить экземпляр BeanFactory'. Here is an example of how your code can look to retrieve the correct instance of
usergui` Spring:
// using ClassPathResource, you can also use a FileResource or other method to load config
Resource res = new ClassPathResource("/beans.xml");
// initialize bean factory
BeanFactory factory = new XmlBeanFactory(res);
// retrieve Spring managed Action class
ActionListener action = factory.getBean("usergui", ActionListener.class);
// configure login button
loginButton.addActionListener(action);
Пример кода ссылается на ActionListener, а не на класс Action напрямую.Обычно при использовании Spring вы хотите взаимодействовать с интерфейсом (ActionListener
), реализованным классом, а не с самим классом (Action
).Это позволяет вам изменять реализацию, на которую ссылается bean-компонент usergui
, например Action -> DifferentAction, без необходимости изменения кода пользовательского интерфейса.