Pull to refresh

Comments 3

Круто! Полезная статья и вопрос рассмотрен очень глубоко в мельчайших деталях.
Не лишним был бы пример для Guice. Это будет выглядеть примерно так (пример не полон, например, отсутствует очистка контекста):
public class ThreadScope implements Scope {
    static final Object NULL = new Object();

    @Override
    public <T> Provider<T> scope(Key<T> key, final Provider<T> unscoped) {
        return new Provider<T>() {
            final ThreadLocal<T> storage = new ThreadLocal<T>();

            @Override
            @SuppressWarnings("unchecked")
            public T get() {
                T obj = storage.get();

                if (obj == null) {
                    obj = unscoped.get();
                    storage.set(obj != null ? obj : (T) NULL);
                }

                return obj == NULL ? null : obj;
            }
        };
    }
}

public class ThreadScopeBindingModule extends AbstractModule {
    @Override
    protected void configure() {
        ThreadScope scope = new ThreadScope();
        bindScope(ThreadScoped.class, scope);
    }
}


Биндинги — аннотацией на классе, либо через модуль (метод configure)
bind(SomeInterface.class).toProvider(SomeImplementationProvider.class).in(ThreadScoped.class);
Спасибо за дополнение! С Guice я не сталкилвался, поэтому ничего написать про него не могу. Сама статья у меня родилась из прототипов, которые делались для заказчика, где были опции JEE и Spring.
Sign up to leave a comment.

Articles