Инжекция с использованием метода поиска и прокси с областью действия - это средство для внедрения бобов с более коротким сроком жизни в бины с большим сроком службы. Однако они обслуживают разные варианты использования.
Внедрение метода полезно в тех случаях, когда бин-одиночка имеет зависимость от бина-прототипа.
Прокси-сервер вводится вместо желаемого компонента и предоставляет этот компонент в зависимости от контекста. Например, если одноэлементный бин (например, контроллер Spring MVC) автоматически подключает бин с заданной областью сеанса, то прокси-сервер доставляет этот бин, принадлежащий текущему сеансу HTTP.
Такой прокси не подходит для ситуации, когда прототипный компонент должен быть получен во время выполнения. Внедрение метода Lookup - один из способов получения экземпляров прототипа во время выполнения.
Однако внедрение метода имеет ограничения, поскольку оно основано на абстрактных методах. Следовательно, некоторые вещи, такие как написание модульных тестов, более обременительны, так как вам нужно обеспечить реализацию-заглушку абстрактного метода. Сканирование компонентов также не работает с абстрактными классами.
Одной альтернативой внедрению метода является ObjectFactory Spring или его эквивалент JSR Provider .
Другой простой способ создания экземпляров прототипа bean-компонента во время выполнения (который даже позволяет предоставлять аргументы конструктора) - реализовать фабрику bean-компонентов, как показано ниже:
@Configuration
public class MyProvider {
@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public MyThing create(String name) {
return new MyThing(name);
}
}
Использование:
@Component
public class MySingleton {
@Autowired
private MyProvider myProvider;
public void doStuffThatNeedsAPrototypeBeanInstance() {
MyThing thing = myProvider.create("some name");
...
}
}