Protože co jiného by Service tvořila, než nějaké veřejné API?
Servisy tvoří především implementaci. Vedle toho mohou ale nemusí tvořit také veřejné API.
Vnitřní uzly mezi vrstvou Service a DAO, ať jsou Component.
O Component jste předtím vůbec nepsal – myslel jsem, že je zahrnujete mezi service. Každopádně ale Service a Component netvoří dvě různé vrstvy aplikace. Rozdíl mezi Service a Component je ve Springu jenom v tom, že Service se účastní transakce ale Component ne. Klidně si ale můžete nadefinovat vlastní stereotypy a ty Springovské ani nemusíte používat. A i když je použijete, Component mohou být součástí API a Service mohou být jen interní implementace. A dává smysl převolávat i služby, které jsou součástí veřejného API.
Z aplikace musí být jasně vidět její Business logika
Což ale nijak nesouvisí s tím, jak používáte Service nebo Component.
a proto to nemůžou být špagety kde Service volají jiné Service.
Píšete „ a proto“ – já tam ale žádnou souvislost nevidím.
tak si otevřu danou Service a musím ji jasně vidět jako na stříbrném podnose, na jednom místě
Přesně tak. Takže abyste mohl tu logiku jasně vidět na jednom místě (na pár řádcích kódu), musíte kód dekomponovat – z té Service, která tvoří veřejné API, budete postupně volat jednotlivé části implementace. A ty jednotlivé části mohou být další Service – ať už veřejné nebo neveřejné.
Třeba když budete vytvářet objednávku v e-shopu spolu s novou registrací uživatele. Interně zavoláte dvě služby, registraci uživatele a uložení objednávky. Obě jsou součástí veřejného API, protože můžete i zvlášť zaregistrovat uživatele (bez objednávky) a také můžete zvlášť jen uložit objednávku (pro uživatele, který už je registrován). A samotná registrace uživatele ještě bude volat další Service, ověření poštovní adresy. To může být jen interní Service, ale nakonec ji stejně asi budete chtít zveřejnit, abyste mohl validaci adresy dělat už průběžně, jak ji uživatel zadává.