Внедрение зависимостей Spring в анонимную реализацию - PullRequest
2 голосов
/ 16 января 2011

У меня есть абстрактный базовый класс, который я использую для сервисов, который включает реализацию различных методов, и один абстрактный метод.У меня есть несколько тесно связанных сущностей, которыми я хотел бы управлять в рамках одного сервиса, поэтому я планирую, чтобы этот сервис был составом анонимных реализаций абстрактного базового сервиса для этих сущностей.Я хотел бы внедрить реализацию Dao в реализацию анонимного сервиса.Я попытался сделать что-то вроде этого.

@Configurable
@Service( value="compositeService" )
public class CompositeServiceImpl 
    extends BaseDataServiceAbstract<AnotherEntity, Long>
    implements CompositeService
{
    BaseDataServiceAbstract<MyObject, Long> myObjectService = 
        new BaseDataServiceAbstract<MyObject, Long>() {

        @Resource( name="myObjectDao")
        BaseDao<MyObject, Long> myObjectDao;

        @Override
        public BaseDao<MyObject, Long> getDao()
        {
            return myObjectDao;
        }
    };

    // other implementation methods and stuff
}

Если я сделаю это таким образом, Дао не будет введен.Если я перемещу дао в содержащий класс, то он работает нормально.Я в порядке, оставив его в содержащем классе, но не знаю, что нужно сделать, чтобы внедрить его в реализацию анонимного класса.

Ответы [ 3 ]

3 голосов
/ 16 января 2011

Пока вы сами вызываете new, Spring не создает экземпляр класса и, следовательно, не сможет внедрить зависимости.

И поскольку вы не можете создавать анонимные классы, не вызывая конструктор по умолчанию самостоятельно, используя new, Spring не сможет вам помочь.

2 голосов
/ 16 января 2011

Вы не можете сделать это напрямую. Однако есть 2 обходных пути:

  • внедряет Dao в классе-владельце, а в @PostConsruct вызывает сеттер для каждого из анонимных классов, устанавливая dao (то есть внедряет его вручную)

  • получить ApplicationContext (либо реализовать ApplicationContextAware, либо я думаю, что автоматическое подключение также будет работать), а в @PostConstruct вызвать appContext.getAutowireCapableBeanFactory().autowireBean(myObjectService). Это заставит пружину автоматически связывать зависимости этих объектов, даже если сами объекты не являются частью контекста пружины.

Но, вообще говоря, я не думаю, что было бы хорошей идеей создавать так много стандартного кода. Должен быть способ для более оптимального решения (я не вижу, потому что у меня нет всей картины)

2 голосов
/ 16 января 2011

Если честно, я не думаю, что это возможно. Чтобы пружина внедрила дао, она должна сначала создать экземпляр этого компонента при запуске загрузчика контекста. Хотя он не может этого сделать, потому что не знает об этом. Это было бы похоже на наличие класса, который вы создаете в своем конструкторе: потому что Spring не создавал его, он не знает об этом. Я думаю, что добавление dao к содержащему классу обслуживания - единственный способ заставить это работать. В качестве альтернативы, вы всегда можете просто создать конкретные экземпляры этих классов и добавить их в свой контекстный XML и вставить их в свой класс обслуживания. Затем вы можете ввести в них дао, но я полагаю, что есть причина, по которой вы не сделали этого в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...