You could also check at the time the injector is created and use a conditional
to decide what bindings to use.
Have a look at the method Modules.override() [1] it allows you to override
bindings with other bindings. This way you don't have to use conditionals in
the modules.
Here some pseudo code:
private Injector createInjector() {
if(config.isProduction()) {
return Guice.createInjector(new ProdModule());
} else {
return Guice.createInjector(override(new ProdModule()).with(new
DevModule()));
}
}
[1]
http://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/util/Modules.html
Am 21. November 2015 06:04:10 MEZ, schrieb Kohei Nozaki <[email protected]>:
>What I actually want to do in the @Provides method is as follows:
>
> @Provides
> FirstService provideFirstService(SecondServiceImpl secondServiceImpl,
>SomeConfig config) {
> if(config.isProduction()) {
> return new FirstServiceImplForProduction(secondServiceImpl);
> }
> return new FirstServiceImplForDevelopment();
> }
>
>And there are many client classes that expect injection of FirstService
>via
>@Inject.
>
>Do you mean that I should invoke conditionally
>injector.getInstance(FirstServiceImplForProduction.class) or
>injector.getInstance(FirstServiceImplForDevelopment.class) instead of
>use
>@Inject in the client classes? I think it's pretty awkward... Or do you
>
>have any better idea?
>
>
>2015年11月21日土曜日 13時44分14秒 UTC+9 Vyacheslav Rusakov:
>>
>> Guice AOP works only on instances created by guice. You create new
>> FirstServiceImpl(secondServiceImpl) manually and so guice can't apply
>
>> transactional on it.
>> So it's "by design" behaviour.
>>
>> Try to avoid doing guice job: let it create all instances for you.
>> If you have a complex case and bean class to instantiate is known
>only at
>> runtime, you can still use injector.getInstance(KnownJustNow.class)
>to ask
>> guice to construct instance for you (with aop).
>>
>> суббота, 21 ноября 2015 г., 10:07:39 UTC+6 пользователь Kohei Nozaki
>> написал:
>>>
>>> Hello,
>>>
>>> @Transactional annotation doesn't work for an instance provided by a
>
>>> method annotated as @Provides. My situation is as follows. I have
>two
>>> classes in the reproducer. A class named FirstServiceImpl which is
>depends
>>> on SecondServiceImpl. These classes have following methods:
>>>
>>> // Method in FirstServiceImpl
>>> @Transactional
>>> public void firstSave(final MyEntity myEntity) {
>>> secondServiceImpl.secondSave(myEntity);
>>> }
>>>
>>> // Method in SecondServiceImpl
>>> public void secondSave(final MyEntity myEntity) {
>>> em.persist(myEntity);
>>> }
>>>
>>> And FirstService is produced by a method annotated as @Provided:
>>>
>>> // Method in MyModule.
>>> @Provides
>>> FirstService provideFirstService(final SecondServiceImpl
>>> secondServiceImpl) {
>>> return new FirstServiceImpl(secondServiceImpl);
>>> }
>>>
>>> In that situation, I expect transaction will begin on
>>> FirstServiceImpl#firstSave() both of following two cases:
>>>
>>> (a) Acquire an instance by calling
>>> injector.getInstance(FirstService.class)
>>> (b) Acquire an instance by calling
>>> injector.getInstance(FirstServiceImpl.class)
>>>
>>> But it doesn't work for (a). It looks like that @Transactional
>doesn't
>>> affect for an instance produced by @Provided method. I found a
>workaround
>>> that putting @Transactional to SecondServiceImpl#secondSave() make
>it work,
>>> But unfortunately I can't make it for real code at my job.
>>>
>>> I've pushed the reproducer to GitHub:
>>> https://github.com/lbtc-xxx/guice-persist-tx
>>>
>>> Is this behavior by design? Or are there any better workaround?
>>>
>>> Thanks.
>>>
>>
>
>--
>You received this message because you are subscribed to the Google
>Groups "google-guice" group.
>To unsubscribe from this group and stop receiving emails from it, send
>an email to [email protected].
>To post to this group, send email to [email protected].
>Visit this group at http://groups.google.com/group/google-guice.
>To view this discussion on the web visit
>https://groups.google.com/d/msgid/google-guice/bb5b0a8e-5fb8-4278-bef8-a8bc14160579%40googlegroups.com.
>For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"google-guice" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/google-guice.
To view this discussion on the web visit
https://groups.google.com/d/msgid/google-guice/B8F26824-56CD-44E2-A509-183B7E83CEB0%40gmx.ch.
For more options, visit https://groups.google.com/d/optout.