Skip to content

Instantly share code, notes, and snippets.

@OutOfBrain
Created May 22, 2017 13:51
Show Gist options
  • Save OutOfBrain/ab437dd4ec2471ed4964612c0f9e0448 to your computer and use it in GitHub Desktop.
Save OutOfBrain/ab437dd4ec2471ed4964612c0f9e0448 to your computer and use it in GitHub Desktop.
Guice custom logger annotation without additional dependencies
public class InjectLoggerTest {
@InjectLogger
private Logger logger;
public static void main(String[] args) throws Exception {
final Injector injector = Guice.createInjector(new ModuleInjectLogger());
final InjectLoggerTest injectLoggerTest = injector.getInstance(InjectLoggerTest.class);
injectLoggerTest.f();
}
@Inject
InjectLoggerTest(final Logger logger) {
this.logger = logger;
logger.warn("the fallback 'default' logger");
}
private void f() {
logger.warn("the specific logger");
}
}
@java.lang.annotation.Target({ FIELD })
@Retention(RUNTIME)
@interface InjectLogger {
}
class ModuleInjectLogger extends AbstractModule {
@Override
protected void configure() {
bindListener(Matchers.any(), new ListenerInjectLogger());
final Logger defaultLogger = LoggerFactory.getLogger("default");
bind(org.slf4j.Logger.class).toInstance(defaultLogger);
}
}
class ListenerInjectLogger implements TypeListener {
@Override
public <I> void hear(final TypeLiteral<I> type, final TypeEncounter<I> encounter) {
Class<? super I> rawType = type.getRawType();
while(rawType != null) {
for(final Field field : rawType.getDeclaredFields()) {
if(
field.getType() == Logger.class &&
field.isAnnotationPresent(InjectLogger.class)
) {
final Logger logger = LoggerFactory.getLogger(field.getDeclaringClass());
field.setAccessible(true);
encounter.register((MembersInjector<I>) instance -> {
try {
field.set(instance, logger);
} catch(final IllegalAccessException e) {
throw new RuntimeException(e);
}
});
}
}
rawType = rawType.getSuperclass();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment