Как создать Spring bean вручную.

Spring beans обычно создаются при старте контекста с использованием того или иного механизма инициализации. Но если надо, бин можно создать и после инициализации, когда контекcт уже запущен и работает.

Подготовка

Начнём с пустого maven проекта, в который добавим Junit, Hamcrest, EasyMock и Spring:

Нам понадобятся два бина. Один мы будем внедрять:

Второй будем конструировать вручную:

Обратите внимание, что у второго бина нет никакой аннотации, заставившей бы Spring его сконструировать.

Создание бина

Чтобы создать бин, нужно попопросить фабрику бинов создать его:

context это экземпляр ApplicationContext. В моём примере я его создаю по месту, но можно его получить через интерфейс ApplicationContextAware или объявить его зависимостью через @Inject.

Вызов createBean() создаёт экземпляр класса и проводит все необходимые инициализационные работы: связывает зависимости, вызывает методы *Aware интерфейсов, вызывает метод инициализации итд. Однако этот бин существует только в виде объекта, который вернула createBean() и он не может быть запрошен из контекста и его жизненный цикл управляется вами, а не Srping’ом.

Регистрация бина

Чтобы создать «настоящий» бин, которым будет управлять Spring и который можно запросить из контекста, необходимо не инстанциировать класс напрямую, а описать будущий бин и попросить Spring построить его по этому описанию:

В объекте BeanDefintion можно описать все аспекты создания бина, которые доступны при инициализации с использованием xml или groovy. Описание бина регистрируется в контексте и дальше Spring управляет его жизненным циклом и доступом к бину.

Код примера доступен на github.