3

Можно ли вводить новые экземпляры факсимильных объектов прототипа в аргументы метода контроллера во время выполнения с использованием аннотаций весной? Поэтому всякий раз, когда вызывается метод, Spring вводит в качестве аргумента соответствующий компонент, знакомый, как он вводит @ModelAttribute. Насколько мне известно, @Autowired поля вводятся только один раз при создании контекста. Получение компонента из фабричного метода контекста не является вариантом, так как это может открыть структуру для своего компонента, нарушая, таким образом, принцип Голливуда.Возможно ли автоподтверждение аргументов метода во время выполнения весной

Я почти закончил чтение «Весна в книге действий» и читал «Весенний справочник» много, но не нашел никакой информации по этому вопросу.

+0

Почему вы хотите вводить прототипы там? Это похоже на запах кода. (Если это действительно разумно, вы всегда можете вводить фабрику вместо готового компонента.) – chrylis

ответ

1

У вас есть несколько вариантов.

Определить прототип фасоли и впрыснуть, которые обернуты в ObjectFactory

@Autowired 
private ObjectFactory<PrototypeBean> factory; 

Вы можете получить его в методе обработчика. Например

@RequestMapping("/path") 
public String handlerMethod() { 
    PrototypeBean instance = factory.getObject(); 
    instance.someMethod(); 
    return "view"; 
} 

Каждый раз, когда вы звоните factory.getObject(), вы получите новый экземпляр.

Что касается этого, нет, Spring MVC не имеет встроенной функции для того, чтобы вставлять bean-компоненты при вызове методов обработчика, с @Autowired или иным способом.

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

+0

Я объединил 'ObjectFactory' с' @ ModelAttribute', и он работал как исключенный, спасибо. Я также нашел альтернативный JSR-стандартный интерфейс под названием «Provider». Даже узнал о '@ Lookup', но он чувствовал себя немного неинтуитивным. –

+0

Я продолжил экспериментировать с HandlerMethodArgumentResolver и, наконец, сумел заставить его работать сразу после объявления его как' component', поэтому я могу связать его с 'context' и а затем добавление автоматически созданного экземпляра вручную в список разрешителей в «WebMvcConfigurerAdapter». Является ли это устаревшим классом или почему я не могу просто определить его как bean-компонент и позволить Spring обнаружить его и интегрировать его в свою инфраструктуру, например ViewResolvers и т. Д.? –

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