dependency-injection - Jersy2注入(inject)slf4j记录器

标签 dependency-injection jersey-2.0 hk2

我正在尝试了解 Jersey 2 开发和上下文依赖注入(inject)。

我不明白如何将需要在构造函数中初始化参数的对象注入(inject)到资源中。 例如:我想@Inject slf4j Logger,使用LoggerFactory构建。

我的资源类是:

@Path("/myresource")
public class MyResource {
    @Inject
    private Logger log;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Answer status() {
        log.info("STATUS");
        return new Answer(200, "Server up and running @ "+ ZonedDateTime.now());
    }
}

我的资源配置是:

public class MyAppextends ResourceConfig {
    public MyApp() {
        register(new MyBinder());
        packages(true, "my.packages");
    }
}

public class MyBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bindFactory(MyLoggerFactory.class).to(org.slf4j.Logger.class);
    }
}

最后,工厂是:

public class MyLoggerFactory implements Factory<Logger> {

    @Override
    public Logger provide() {
        return LoggerFactory.getLogger(TYPE_FOR_LOGGING.class);
    }

    @Override
    public void dispose(Logger logger) {

    }
}

如何指定 TYPE_FOR_LOGGING 作为参数,以便在我想要的每个资源中注入(inject)正确初始化的记录器?

谢谢

最佳答案

您要查找的内容称为 InstantiationService 。您可以将其注入(inject)到工厂中以找出谁在提供方法内调用工厂。

下面是 hk2 测试中的代码示例,说明了 InstantiationService 的用法。

@Singleton
public class CorrelationFactory implements Factory<PerLookupServiceWithName> {
    private final static PerLookupServiceWithName NULL_SERVICE = new PerLookupServiceWithName() {

        @Override
        public String getName() {
            return null;
        }

    };

    @Inject
    private InstantiationService instantiationService;

    /* (non-Javadoc)
     * @see org.glassfish.hk2.api.Factory#provide()
     */
    @Override @PerLookup
    public PerLookupServiceWithName provide() {
        InstantiationData data = instantiationService.getInstantiationData();
        if (data == null) {
            return NULL_SERVICE;
        }

        Injectee parent = data.getParentInjectee();

        if (parent == null) {
            return NULL_SERVICE;
        }

        Class<?> parentClass = parent.getInjecteeClass();
        if (parentClass == null) {
            return NULL_SERVICE;
        }

        Correlator correlator = parentClass.getAnnotation(Correlator.class);
        if (correlator == null) {
            return NULL_SERVICE;
        }

        final String fName = correlator.value();

        return new PerLookupServiceWithName() {

            @Override
            public String getName() {
                return fName;
            }

        };
    }

    /* (non-Javadoc)
     * @see org.glassfish.hk2.api.Factory#dispose(java.lang.Object)
     */
    @Override
    public void dispose(PerLookupServiceWithName instance) {
        // DO nothing
    }

}

关于dependency-injection - Jersy2注入(inject)slf4j记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39366458/

相关文章:

c# - ASP.NET MVC3 手工编码 IoC

c# - DI,为一个接口(interface)定义注册多个实例

Java Jersey PathParams 检查和 NotFoundException 自定义消息

java - Spring Boot Jersey 静态内容,资源位于 "/"

java - HK2 与 Jersey 2 和 Apache Shiro 的依赖注入(inject)

java - 如何使用 Mockito 和 JUnit 定义通过链依赖调用的方法的行为?

c# - asp.net 添加 ApiController 作为依赖注入(inject)服务

java - OpenCSV 无法读取 Jersey2 创建的 InputStream

dependency-injection - hk2:为什么bind(X.class).to(X.class)

java - 具有循环依赖的 HK2 注入(inject)