Там уже упоминалось 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 илинет).
Надеюсь, это понятно.