У меня есть объект, созданный вне контейнера. У этого объекта есть один метод accept(...). Обратите внимание, что это не метод интерфейса, так как количество и тип параметров неизвестны.
Во всяком случае, у меня также есть Method метода accept().
Я хотел бы выполнить этот метод в контексте приложения Spring, позволяя Spring автоматически связывать параметры метода перед запуском метода.
Пример:
public class MyCmd {
public long accept(@AutoWire MyService service) {
...
}
}
и позже:
MyCmd cmd = new MyCmd(); // no spring here!
magicRunner.invoke(cmd); // magic here
Здесь я хочу иметь возможность запускать accept(), но позволить Spring внедрить MyService в качестве аргумента метода.
Есть ли что-нибудь подобное весной? Или мне все это приходится делать вручную?




Я думаю, что это вряд ли выполнимо, чтобы смешать отражение и автоматическое подключение Spring с помощью аргументов метода, но все же есть подход, который выглядит эквивалентным тому, чего вы пытаетесь достичь (если я правильно это понимаю).
MyCmd можно зарегистрировать с помощью "прототипа" в AplicationContext. Он будет автоматически связан с другими существующими bean-компонентами Spring, но новый экземпляр будет возвращаться каждый раз, когда вы будете искать его в контексте:
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Data
public class MyCmd {
@Autowired
private MyService myService;
public long accept() {
// ...
}
}
Теперь, когда вам нужно использовать MyCmd:
@Autowired
private ApplicationContext applicationContext;
public void doMyThings() {
MyCmd myCmd = applicationContext.getBean(MyCmd.class);
// myCmd is a new ref each time, myService is autowired inside
magicRunner.invoke(cmd);
}
Да, вы можете использовать @Configurable для внедрения зависимых объектов домена в Spring с помощью AspectJ.
Вот документация по @Configurable.
Пример с конструктором DI:
@Configurable
public class MyCmd {
@Autowired
public MyCmd(MyService service) {
...
}
}
Но будьте осторожны: с этого момента это bean-компонент, управляемый Spring, поэтому вы создаете его экземпляр не могу как:
MyCmd cmd = new MyCmd();
Но вам придется вводить зависимость как обычно.
Да, знаю, но я хочу, чтобы мой объект был просто подключен.
Спасибо, но тогда мне нужно открыть applicationContext. Более того, класс там регистрируется, и я не хочу