Объедините два проекта на основе Maven на двух платформах - PullRequest
1 голос
/ 30 сентября 2011

У меня есть два проекта maven, например, MvnSpring и MvnGuice.MvnSpring работает над созданием пружинных и спящих рам. А MvnGuice работает над Google Guice и Mybatis. Мне нужно объединить обе функции вместе. Оба следуют синглтон-схеме. Мне нужно получить некоторый класс MvnSpring в MvnGuice во время кодирования. Так что я создал флягу MvnSpring и поместил ее в репозиторий .m2 и дал подробности зависимости в MvnGuice. Теперь я могу импортировать классы MvnSpring в классы MvnGuice. MvnSpring использует пружинное внедрение зависимостей, а MvnGuice использует графическое внедрение зависимостей для создания объектов. Теперь в потоке MvnSpring есть MSserviceImpl (реализует MSservice)> MSdaoImpl (реализует MSdao). Теперь мне нужно вызвать класс MSService из MvnGuice. Затем во время выполнения он показывает ошибку, как класс MSService является нулевым. Затем я сделал инъекцию зависимостей для класса MSService в MvnGuice. Теперь элемент управления достигает MSserviceImpl, но теперь MSdao здесь нулевой. Можно ли запустить MvnSpring вместе с MvnGuice. Я надеюсь, что тогда я смогу решить проблему.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Хотя Spring и Guice нацелены на одну и ту же проблему, IoC, для ее решения используются совершенно разные подходы.Они отличаются как по функциональности, так и по конфигурации, где Spring имеет определения bean-компонентов, а Guice использует привязки.

К счастью, у них есть общие основания в том, что они оба поддерживают JSR-330 ,спецификация стандартов, которая определяет набор аннотаций.Это позволяет вам писать свои синглтоны и описывать необходимые им инъекции, не зависящие ни от Spring, ни от Guice.

Таким образом, вы можете делиться своими синглетами между проектами независимо от того, какую среду вы используете в конкретном проекте.Я бы не рекомендовал использовать Guice и Spring в одном проекте, за исключением случаев, когда между ними четко определено разделение.Например, вы можете использовать Guice для модуля, который используется кодом Spring через определенный API, который скрывает тот факт, что он внутренне основан на Guice.

1 голос
/ 27 марта 2014

Там уже упоминалось JSR-330.В некоторых случаях этого может быть недостаточно, например, у вас есть код:

final String className = config.getProperty(«serviceImpl»);
// Class.forName(name) and check required interface for type safety
final Class<? extends Service> serviceClass = Reflection.classForName(className, Service.class);
final Service service = injector.getInstance(serviceClass);

В различных средах DI вы должны поддерживать как com.guice.inject.Injector.getInstance (), так и org.springframework.context.ApplicationContext.getBean () реализации.

Существует черновик решения sdif4j Простой фасад внедрения зависимостей.Идея этого проекта заключается в инкапсуляции логики различных DI-структур с собственной абстракцией для расширения возможностей JSR-330 по умолчанию.Обратите внимание, что публичных выпусков пока нет, но вы можете найти идеи, как решить вашу проблему или сделать внутренний выпуск в развилке.Общая проблема заключается в том, что ваши проекты MvnSpring и MvnGuice должны основываться на JSR-330 (вместо аннотаций guice / spring) и org.sdif4j: sdif4j-api (или вашей собственной абстракции; только если требуется функциональность инжектора),Рекомендуется сделать необязательные зависимости guice и spring (для компиляции, но не для экспорта), чтобы клиенты библиотеки могли сами выбирать DI.В вашем MvnCompineGuiceAndSpring вы просто объявляете зависимость sdif4j-guice или sdif4j-spring (она аналогична использованию slf4j) и настраиваете свою среду DI.Вы можете найти различные примеры в подпроекте тестирования.

Еще несколько замечаний: область действия Spring по умолчанию - singleton, Guice - prototype (терминология Spring).Итак, если вы хотите создать прототип bean-компонента, вы можете использовать:

@org.springframework.context.annotation.Scope("prototype")
@javax.inject.Named
public class TestPrototype {
}

Подсказка Spring @Scope должна игнорироваться guice, даже если spring не присутствует в вашем classpath.Также вы должны объявить все ваши компоненты Singleton с помощью аннотаций @ javax.inject.Named и @ javax.inject.Singleton для поддержки Spring и Guice, например:

@javax.inject.Named
@javax.inject.Singleton
public class TestSingleton implements ITestSingleton {
    public TestSingleton() {
    }
}

Как и в аннотации @Scope, выможет использовать скрытые аннотации @ImplementedBy (@ProvidedBy) в вашем коде (когда это возможно; будьте осторожны с этим, как правило, это не очень хорошая практика), что также следует игнорировать в Spring DI (в обоих случаях, если Spring существует в classpath илинет).

Надеюсь, это понятно.

...