1

У меня есть один базовый абстрактный класс скажет А, который расширяется от другого абстрактного класса B и, наконец, один конкретный класс С простирающегося B.@Autowired для источника данных в абстрактном классе не работают и получить нулевой объект

Здесь в Класс C пытается получить DataSource autowired в базовом Abract класса А. Но @Autowired не работает в абстрактном классе и даже получить null в SOP (DataSource)

Если я autowire dataSource в конкретном классе с, его работы.

Пожалуйста, помогите мне в этом. Я хочу использовать общий базовый класс для получения dataSource. Но @Autowired в нем не работает.

Будет очень полезно, если кто-то даст решение с примером.

Заранее спасибо ..

Пример кода:

abstract Class A 
     { 
    @Autowired DataSource dataSource; 

    setConnection(){ sop(dataSource); } 

     } 
    abstract Class B extends A 
     { -- Method conn() 
    { setConnection();} 
     } 
    Class C extends B 
    { 
    Invoke conn(); 
    } 
+0

Вы определили сканирование базового пакета в конфигурации весны? –

+0

Опубликовать некоторый фактический код вместо псевдокода. Непонятно, где вызывается метод 'conn()' и то, как вы на самом деле создаете экземпляры. В принципе поле '@ Autowired' не может быть нулевым, если вы не вызываете методы в конструкторе, тогда поля не устанавливаются ИЛИ, когда вы сами создаете новые экземпляры (они находятся вне контроля Spring и не будут вставляться). Также, если вы используете Spring, я предлагаю использовать 'JdbcTemplate' вместо того, чтобы взломать и управлять соединениями самостоятельно. –

ответ

1

Это должны работы при условии, у вас есть все абстрактные классы в ComponentScan пути. См.: Spring can you autowire inside an abstract class?

Хотя я сомневаюсь, если действительно необходимо иметь абстрактный класс просто для установки DataSource. Весенние бобы по умолчанию являются синглтонами, поэтому вы получите тот же самый экземпляр везде, если вы просто @Autowired источник данных во всех «подклассах» напрямую.

0

То, что вы пытаетесь сделать, должно работать без проблем. Как говорит @Ben в своем ответе, все родительские классы должны проверяться весной.

Кроме того, производится аутсорсинг после создание объекта. Это означает, что если вы вызываете свой метод C.conn() из своего конструктора класса C, поле dataSource все равно будет отменено (т. Е. Его значение будет null).

Если бы я был вами, я бы проверял, соблюдены ли вышеуказанные условия.

Смежные вопросы