Отражение + впрыск зависимости от пружины - PullRequest
5 голосов
/ 21 сентября 2011

Я пытаюсь понять, смогу ли я совместить отражение с внедрением зависимости пружины следующим образом:

public interface ClientCommand {

    public void execute(...);

    public static enum Command {
        SomeCommand(SomeCommand.class);

        private Class<? extends ClientCommand> clazz;

        private Command(Class<? extends ClientCommand> clazz) {
            this.clazz = clazz;
        }

        public Class<? extends ClientCommand> getClazz() {
            return clazz;
        }

        public static ClientCommand getClientCommand(String name) {
            Command command = Enum.valueOf(Command.class, name);
            return command.getClazz().newInstance();
        }
    }
}

Это создаст экземпляр класса команды на основе имени, переданного в getClientCommand.Это пример расширения класса ClientCommand:

public class LoginCommand implements ClientCommand {
    @Autowired
    private UserRepository userRepository;

    public void setUserRepository(@Qualifier("userRepository")UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void execute(...) {
        ...
    }
}

И хранилище выглядит примерно так:

@Repository("userRepository")
public class UserRepositoryImpl implements UserRepository {
    ....
}

Когда выполняется метод LoginCommand.execute (), UserRepository имеет значение null.Если я использую newInstance () для создания объекта, заботится ли Spring вообще, чтобы внедрить зависимости?Больше, чем для практического использования, это понять, теоретически возможно ли заставить этот код работать.Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Чтобы ответить на этот вопрос:

Если я использую newInstance () для создания объекта, заботится ли Spring вообще, чтобы внедрить зависимости?

Я будуответить нет, не по умолчанию.Spring будет внедрять зависимости только от объектов, которыми Spring управляет, и если вы используете отражение для его создания или оператор new, то вы - тот, кто контролирует, а не весна.

Но , есть надежда.Вы можете использовать AspectJ для выполнения байт-кода, когда используется оператор new, или даже когда используется Class.newInstance().

Посмотрите эту документацию Spring , чтобы узнать больше об этом подходе..

1 голос
/ 21 сентября 2011

Поскольку вы создаете объект самостоятельно, Spring не будет внедрять зависимости от объекта.Он также не будет добавлять прокси-серверы AOP для него, если он настроен на это.

Вы можете использовать AspectJ для обработки кода, добавив логику, необходимую для внедрения зависимости в экземпляр.Это делается полностью прозрачно.

Или вы можете сделать это самостоятельно, используя AutowireCapableBeanFactory.Это полувнутренний интерфейс, который вы можете использовать, и он предназначен именно для этой цели.У него есть набор методов, которые выполняют различные части создания и внедрения, вам, вероятно, понадобится метод createBean () .

Вы можете получить AutowireCapableBeanFactory, вызвав getAutowireCapableBeanFactory для вашего ApplicationContext.

В вашем случае, вероятно, было бы неплохо создать CommandFactory, сделать так, чтобы он реализовывал ApplicationContextAware и имел такой метод, как createCommand (), который вызывает createBean ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...