3
A
回答
2
InjectLogger
是由您自己定义的自定义注释类型。
这里有一个简单的例子:
Log4j2CustomInjection.java
package test.guice;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.matcher.Matchers;
public class Log4j2CustomInjection {
public static void main(String[] args) {
Injector injector =
Guice.createInjector(
new AbstractModule() {
@Override
protected void configure() {
bind(PaymentService.class).asEagerSingleton();
bindListener(Matchers.any(), new Log4JTypeListener());
}
});
PaymentService ps = injector.getInstance(PaymentService.class);
ps.logger.info("hello");
}
}
PaymentService.java
package test.guice;
import org.apache.logging.log4j.Logger;
public class PaymentService {
@InjectLogger Logger logger;
}
InjectLogger.java
package test.guice;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface InjectLogger {}
Log4JTypeListener.java
package test.guice;
import com.google.inject.TypeLiteral;
import com.google.inject.spi.TypeEncounter;
import com.google.inject.spi.TypeListener;
import java.lang.reflect.Field;
import org.apache.logging.log4j.Logger;
class Log4JTypeListener implements TypeListener {
public <T> void hear(TypeLiteral<T> typeLiteral, TypeEncounter<T> typeEncounter) {
Class<?> clazz = typeLiteral.getRawType();
while (clazz != null) {
for (Field field : clazz.getDeclaredFields()) {
if (field.getType() == Logger.class && field.isAnnotationPresent(InjectLogger.class)) {
typeEncounter.register(new Log4JMembersInjector<>(field));
}
}
clazz = clazz.getSuperclass();
}
}
}
Log4JMembersInjector.java
package test.guice;
import com.google.inject.MembersInjector;
import java.lang.reflect.Field;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
class Log4JMembersInjector<T> implements MembersInjector<T> {
private final Field field;
private final Logger logger;
Log4JMembersInjector(Field field) {
this.field = field;
this.logger = LogManager.getLogger(field.getDeclaringClass());
field.setAccessible(true);
}
public void injectMembers(T t) {
try {
field.set(t, logger);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
相关问题
- 1. 如何自定义log4j2 RollingFileAppender?
- 2. Log4j2自定义筛选器
- 3. 自定义值注入
- 4. Log4j2自定义字段套接字appender
- 5. Angular JS注入自定义服务
- 6. 注入dependecy自定义过滤器angularJS
- 7. 自定义ViewResolver和依赖项注入
- 8. Ninject自定义注入属性
- 9. ASP.NET MVC自定义IPrincipal注入
- 10. 自定义验证注解引入ConcurrentModificationException
- 11. 配置ExtentReports注入自定义html
- 12. 将ConversionService注入自定义转换器
- 13. 自定义注释?
- 14. Log4j2来自地图的自定义电子邮件主题
- 15. 注入另一个对象的Java自定义注释
- 16. 将自定义服务注入到自定义验证程序中
- 17. 注册自定义控件
- 18. 自定义注释处理
- 19. 自定义注册Laravel 5.1
- 20. Flask-Security:自定义注册
- 21. 注册自定义元素
- 22. 自定义注释引脚
- 23. 自定义注释错误
- 24. 自定义django注册表
- 25. FOSUserBundle注册自定义
- 26. 设计注册自定义
- 27. iOS Mapkit自定义标注
- 28. Angular 2 - 自定义注释
- 29. 自定义MKAnnotationView标注
- 30. 自定义注释用法