powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring autowire на автомате
18 сообщений из 18, страница 1 из 1
Spring autowire на автомате
    #38459491
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго вечера.
Решил сделать небольшую программку для себя. Но после разработки только веба на spring mvc, столкнулся с проблемой автоваринга сервисов в локальном приложении.

Суть в том, что сервис работает изумительно при его вызове
Код: java
1.
2.
3.
4.
5.
6.
ApplicationContext context = 
                  new ClassPathXmlApplicationContext(new String[] {"root.xml"});
          
                EmployeeBean employee = (EmployeeBean)context.getBean("employee");
                System.out.println(employee.getFullName());
                System.out.println(employee.getDepartmentBean().getName());



Но мне нужно из многих классов доставать этот сервис, не делать же холдер с сохранёнными сервисами. А вот аннотация @Autowire ничего не даёт.

Вот root контекст
Код: xml
1.
2.
3.
    <context:annotation-config />
    <context:component-scan base-package="com.incore" />
    <import resource="services-context.xml"/>



и services-context.xml
Код: xml
1.
2.
3.
4.
    <context:annotation-config />
    <context:component-scan base-package="com.incore" />

    <bean class="com.incore.configs.ConfigReader" id="configReader_service"/>



Подскажите, как заставить аннотацию @Autowire работать?
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459495
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл добавить.

В ходе загрузки приложения сервис инициализируется судя по логу
[17:11:55] DEBUG Finished creating instance of bean 'configReader_service'
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459576
organism
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4j, класс EmployeeBean покажите... сдается мне, что он у вас не аннотирован как бин (Component, Service, etc)
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459586
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
organism, да нет, есть у него аннотация @Service

...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459608
organism
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4j,

Нифига не пойму.. вы какой бин хотите заинжектить? EmployeeBean или ConfigReader? Покажите класс, где вы используете аннотацию @Autowired.
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459610
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
organism, прошу прощения. не то вставил в первый пост.
Заинжекстить я хочу класс ConfigReader, у него есть аннотация @Service

инжект в нужном классе стоит
Код: java
1.
2.
    @Qualifier("configReader") @Autowired @Getter
    private ConfigReader configReader;
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459624
organism
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4j,

теперь стоит наверно убрать бин из services-context.xml, раз он у вас определён в коде..
Код: java
1.
<bean class="com.incore.configs.ConfigReader" id="configReader_service"/>



вместо конкретного типа определяют обычно интерфейс, а не конкретный тип бина, иначе смысл теряется всей концепции:
т.е. вместо
Код: java
1.
private ConfigReader configReader;


нужно так
Код: java
1.
private IConfigReader configReader;



Далее зачем вы аннотацию Qualifier определили? у вас много реализаций IConfigReader и вы не можете однозначно определить какую именно заинжектить? Сомневаюсь..

по идее должно быть как-то так

Код: java
1.
2.
@Autowired
private IConfigReader configReader;




Ну и на последок, покажите все же весь класс, в котором инжектится ConfigReader...
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459630
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
organism, в классе ничего странного, вроде бы, нет.
Аннотация на месте.


Может при старте приложение что-то нужно прописать, что бы заавтоварились все компоненты?
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459634
organism
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4j,
Вы не поняли.. тот класс показать, в котором у вас определено поле IConfigReader:

Код: java
1.
2.
@Autowired
private IConfigReader configReader;



AFAIK, класс, в котором определено поле помеченное, как Autowired.. должен быть сам определен как спринговый бин.. иначе спринг не сможет его найти и инициализировать как надо..
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459639
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
organismиначе спринг не сможет его найти и инициализировать как надо..

Эти слова сыграли роль :) Спасибо. И последний вопрос. Инициализировать нужно каждый сервис отдельно или можно как-то все сразу?
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459646
organism
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4jИнициализировать нужно каждый сервис отдельно или можно как-то все сразу?

Как сразу? Обычно написали сервис, определили его как бин (аннотировали скажем как @Service)... то место где его юзаете, например, если веб-приложение, скажем, в контроллере, определяете поле, инжектите сервис.. и используете... обычно так...
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38459648
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
organism, в вебе да. Так и есть. Но сейчас мне приходится в main классе инициализировать каждый.
Код: java
1.
2.
3.
4.
ApplicationContext context = new ClassPathXmlApplicationContext("/xml/root.xml");
        setConfigService(context.getBean(ConfigService.class));
        ...
        setAccountService(context.getBean(AccountService.class));



И тогда сервисы станут доступными в других классах.
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38463496
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема вернулась с другой стороны.

Я инициализирую сервис, всё нормально работает. Но стоит вызвать этот сервис из другого класса, то он возвращает NPE.


Код: java
1.
2.
3.
4.
5.
6.
setAccountService(context.getBean(AccountService.class));   //инициализация 

//Создаю экземпляр другого класса в конструкторе которого есть вызов сервиса
new Config();

 



и в самом классе Config
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Autowired @Getter @Setter
    private AccountService accountService;

    // it has no instancies
    public Config() {
        if(getAccountService() == null)
            log.info("SERVICE NULL");
        else
            log.info("NOT NULL " + getAccountService());
    }



возвращает всегда NULL.
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38463504
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4j,

Вы создали новый объект. Спринг про него ничего не знает. Как он к нему вообще может обратиться, чтобы установить зависимости?
Для решения этой проблемы у контекста есть методы autowire, в которые можно передать объект, созданый без участия Spring.
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38463514
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно решить проблему посредством спринга? Ибо у меня очень много создаётся экземпляров классов.
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38463522
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4jА можно решить проблему посредством спринга? Ибо у меня очень много создаётся экземпляров классов.
AutowireCapableBeanFactory.autowireBean()
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38463582
st4j
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как я понял, в каждом мне нужном классе нужно вызывать контекст и вызывать бин?
...
Рейтинг: 0 / 0
Spring autowire на автомате
    #38463627
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st4jКак я понял, в каждом мне нужном классе нужно вызывать контекст и вызывать бин?
Вопрос не понятен.
Dependency Injection подразумевает что экземплярами управляет контейнер или отдельный модуль. А не программисте где-попало создаёт экземпляры вручную.
Если вы массово везде пишете new Config(), то для чего вам вообще Spring тогда?
Нужно везде Service Locator тогда использовать, а не Dependency Injection
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring autowire на автомате
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]