Hey guys,
So it's occurred to me that a number of classes in our codebase are injecting a so called 'ResourceEnvironment' so they can use it to retrieve a static image from whiten our deployed jar. This got me wondering if I could achieve something as slick as injecting the image directly with guice:
public class SomeService{
private final Image image;
@Inject
public SomeService(@Named("/com/mycompany/myasset.png") myAssetImage){
image = myAssetImage;
}
//big complex methods doing big complex method things.
}
//with a module containing
public class ModuleToDoThat implements Module{
public void configure(){
//...
}
@Provides Image getImageWithName(Named name){
return getClassLoader().getResource(name.value());
}
}
This would actually reduce a fair bit of code on our code base; using annotations to pass meta-data about the specific instance that's needed
at runtime would be a really cool feather for guice's cap.
AFAIK the feature I'm requesting is binding annotations to be whitelisted (along with the calling Injector) as things that you can request without providing an explicit configuration path for them. A little less obtusely: with the injector you don't need to tell guice how to provide a provider method with an injector, it just assumes the injector you're looking for is the one doing the provide-ing. I would ask that binding annotations be given the same 'scope', such that any binding annotations used would be automatically wired to that provider method (and if they don't exist, the provider methods eligibility for provision removed).
Needless to say this is a fair bit of rope to hang yourself with, in
the event that you need to start passing more information than is
available at annotation-writing-time, some developers (myself
included) might try to ham-fist some things into static scope so that they can be used by the annotation. That said, I think the benefit outweighs the cost; it would be really slick and cut 50 lines of cruft off my codebase.
I'm
fairly certain I could hack something together with provision listener and a stack (probably static), but rather than go down that road I figured I should post this as a request-for-help and/or a feature request here first.
Is there a way to do this without using the SPI that would give me the same effect? If I was to try to do it myself with a stack and a provision listener, would it be as hard as I think it is? Is this something I should request a little more formally (by creating a github issue)?
cheers,
-Geoff