2016-10-09 2 views
1

Мы знаем, что каркасы DI, такие как Spring и Guice, иногда создают прокси вместо фасоли. Чтобы сравнить эти прокси в методах equals и hashcode, мы должны использовать оператор instanceOf, потому что их класс больше не совпадает с исходным. Также (возможно) эти прокси могут быть созданы в некотором неинициализированном состоянии, как и прокси-серверы Hibernate (это только моя догадка).Spring and Guice: когда рамки DI создают прокси?

Я знаю только один случай, когда Spring создает прокси-сервера из bean-компонента: когда вы комментируете его с помощью @Configuration. Есть ли другие ситуации? Создает ли Spring неинициализированные прокси, которые только инициализируют свои поля после доступа к этим полям?

Я нашел вопрос о similair: When does Spring creates proxies in the bean's lifecycle?, но учтите, что он относится к случаю использования АОП. Я прошу об использовании простого DI без участия АОП.

Тот же вопрос для Guice!

+4

Guice обычно не создает прокси-сервер, если не существует AOP, или для решения проблемы с циклической зависимостью (и тогда только если привязка относится к классу, а не к интерфейсу). –

ответ

1

Spring использует прокси при каждом использовании аннотаций, таких как @Transactional или @Cacheable. Это АОП не имеет ничего общего со сложным АОП, который требует компиляции или ткачества.

Во всяком случае, имейте в виду, что если в одном из ваших услуг вы autowired в хранилище и внутри службы вы создаете класс, где вы установили хранилище, это будет автоматически использоваться в качестве прокси (если есть аннотация, требующая его).

О Guice, ответ в комментарии @Oliver.

1

В HK2 независимо от того, сделаны ли прокси для точек впрыска, зависит от области/контекста вставляемого компонента. В частности, в HK2 область может быть аннотирована с помощью Proxiable. Вы можете управлять аннотацией Proxiable, должны ли быть созданы прокси для инъекций бобов в другие компоненты той же области действия.

Вы можете дополнительно контролировать, будут ли бобы в неядерных областях получать прокси или бобы в соседних областях НЕ должны быть проксированы аннотациями Unproxiable и UseProxy. В EDSL есть эквивалентные глаголы (например, ServiceBindingBuilder.proxyForSameScope).

В добавлений прокси будет генерироваться HK2, если АОП был в игре

1

Assisted инъекции в Guice может быть вариант использования, который может представлять интерес для Вас. Длинная история очень короткая.

Factory интерфейс: реализация

public interface PaymentFactory { 
    public Payment create(Date startDate, Money amount); 
} 

Оплата:

public class RealPayment implements Payment { 
    @Inject 
    public RealPayment(
     CreditService creditService, 
     AuthService authService, 
     @Assisted Date startDate, 
     @Assisted Money amount); 
    } 
    ... 
} 

Переплет:

install(new FactoryModuleBuilder() 
    .implement(Payment.class, RealPayment.class) 
    .build(PaymentFactory.class)); 

Guice будет генерировать PaymentFactory реализацию для вас.

Подробнее см. В wiki.Примечание: это расширение. Я не знаю больше случаев использования Guice, за исключением тех, о которых упомянул Оливье Грегуар в своем комментарии.

Смежные вопросы