Прицельный обзор: Как работает Dependency Injection в Spring Framework

| Комментарии

Для того, чтобы ответить на этот вопрос, нужно определить точку входа. Для начала организуется контекст приложения - вручную для стандартных приложений или автоматически при использовании Spring‘а в Web. Сразу хочу отметить, Spring Framework отличается высоким уровнем абстракции. Немалая часть реализации организуется путем глубокого наследования (5-6 уровней). Так ApplicationContext компонует в себе общий функционал по работе с состоянием приложения путем реализации нескольких интерфейсов. Затем, делая cast к тому или иному интерфейсу, можно работать с определенным функционалом. К примеру:

1
2
3
4
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
BeanFactory beanFactory = context;
PrintService printService = (PrintService) beanFactory.getBean("printService");
printService.print();

Во время создания контекста приложения инициируется его конфигурация, где описываются бины или пакеты, в которых стоит их искать, после чего создаются все связанные компоненты. В терминах Spring’а выполняется refresh контекста. Создается фабрика bean’ов, определяются post processor’ы фабрики. Дело в том, что бины загружаются при старте приложения в память. Они конфигурируются через component-scan директиву в xml или напрямую директивой bean. Все начинается с парсинга конфига с помощью ConfigurationClassPostProcessor‘а. Создается парсер конфига ConfigurationClassParser и вызывается его метод parse. Отдельные объекты обрабатывают разные директивы конфига и загружают бины с помощью reflection’а. BeanFactory реализует интерфейс BeanDefinitionRegistry, который описывает структуру объекта для доступа к найденным бинам. Этот объект наполняется через ConfigurationClassParser.

Метод beanFactory.getBean("printService") просто получает экземпляр проинициализированного бина из Map’ы.

DI базируется на трех частях Spring‘а - Core, Context, Beans. Куча абстракции, наследования. Используются крупные объекты, реализующие разные функциональные роли. Все это немного усложняет копание в Spring’e. Спасает хороший JavaDoc.

Comments