Как компоненты располагаются друг относительно друга
Компонент — это составная часть системы, предполагающая наличие других компонентов, с которыми она будет взаимодействовать.
Из двух взаимодействующих компонентов системы один расположен выше другого.

В многокомпонентной системе положение каждого компонента относительно других может быть выше или ниже (рис. A). Положение компонентов друг относительно друга определяется следующим образом: если компонент A знает API компонента B и может обращаться к нему, то A является вышестоящим по отношению к B. Например, в типичном веб-приложении серверная часть является нижестоящей по отношению к JS-клиенту, потому что клиент знает её API и обращается к ней; также база данных является нижестоящей по отношению к серверной части. При этом JS-клиент не является вышестоящим компонентом по отношению к базе данных, потому что не обращается к ней.
Если оба компонента A и B знают API друг друга, мы можем говорить, что они располагаются — как бы это ни звучало — одновременно и выше, и ниже друг относительно друга (рис. B). Для простоты будем называть это верхне-нижним расположением. Например, компоненты могут обмениваться событиями напрямую, без внешней шины. Каждый компонент предоставляет возможность подписаться на свои события, поэтому оба одновременно становятся подписчиками друг друга.
Направление обращения не определяет взаимное расположение компонентов, и один и тот же компонент может вызываться как вышестоящим, так и нижестоящим компонентом. Например, к серверной части веб-приложения обращаются и JS-клиент, и платёжный шлюз через webhook, однако первый является вышестоящим, поскольку знает API сервера, а второй — нижестоящим, поскольку сервер лишь предоставляет точку для webhook’а, а сам контракт задаётся шлюзом. Это похоже на то, как если бы сервер реализовывал подписчика в шаблоне «Наблюдатель», а интерфейс этого подписчика задавал шлюз.
Знание взаимного расположения компонентов помогает правильно размещать классы внутри компонента. Например, некоторые архитекторы предпочитают отделять «API-образующую» часть инфраструктурного слоя от остальной его части, вынося её в отдельный Maven-модуль. Контроллер, через который к компоненту обращается вышестоящий компонент, относится к «API-образующей» части, тогда как контроллер webhook’а располагается вне неё, то есть в другом Maven-модуле.