Вся и идея spring и ему подобных в технологиях DI и IoC.
Первая технология
DI - Dependency Injection - внедрение зависимостей. Смысл следующий, пусть у нас есть класс, который зависит от другого класса, тогда контейнер автоматически найдет все зависимости и сам проинициализирует нужный класс. Пример: пусть у нас есть интерфейс "Фрукт", класс "Яблоко", интерфейс "Паразит", класс "Червяк". В класса "Яблоко" указываем в одном из методов или конструкторе зависимость от интерфейса "Паразит". Теперь положим в контейнер классы "Червяк" и "Яблоко", и попросим контейнер создать дать нам инстанс класса "Яблоко".
Контейнер выполнит следующие действия:
- посмотрит, что без класса, реализующего интерфейс "Паразит", он не может создать "Яблоко".
- посмотрит на зарегистрированные классы, не реализует ли кто интерфейс "Паразит" и обнаружит класс "Червяк"
- создаст инстанс класса "Червяк"
- создаст инстанс класса "Яблоко" и передаст ему инстанс класса "Червяк"
- отдаст созданный инстанс "Яблоко" нам.
Теперь мы можем создать класс "Ева" с зависимостью от интерфейса "Фрукт", положить его в контейнер, и положить в контейнер класс "Адам" с зависимостью от "Ева" и попросить создать нам инстанс класса "Адам" :-)
MutablePicoContainer pico = new DefaultPicoContainer();
pico.addComponent(Fruit.class);
pico.addComponent(Worm.class);
pico.addComponent(Eve.class);
pico.addComponent(Adam.class);
.....
Adam adam = pico.getComponent(Adam.class);
Вторая технология
IoC - Inversion of Control - контроль управления - это как раз и есть одна из реализаций принципа DI, когда внедрение зависимостей происходит через посредника - фреймворк.
Легче всего разобраться с этим (а уж потом переходить к spring) - поработать с простыми контейнерами типа picocontainer , nanocontainer и guice.
-
picocontainer.com/introduction.html
-
https://github.com/google/guice