Spawning in 7 days to die works from 4 files (in order of importance):
--- EntityClasses.xml ---
Contains all the statistics on all the animals, zombies, vehicles, traders, npcs etc. This is where the names of said entities are drawn from. I will not go into detail on this one to much since its a bit out of scope for your question.
--- EntityGroups.xml ---
Contains all the lists, this file is like the loot.xml but then only for making groups. Basically this file sets lists where the actual spawning is done from, it references EntityClasses and is thus dependent on that file. As long as an entity referenced here exists in there it can be spawned (or attempted to spawn).
Each group has at least 1 entry but essentially the amount of entries can be large, not sure there is a limit, but I assume its as big as standard array or list in C# allows, which should be plenty. I have created extensive lists for Gnamod and have not encountered a limit here.
Each list entry, say animalStag, has a probability, which you can see a % or chance it spawns. But the total of number you put in the list is what is leading here. If you set the stag to 0.01, and there are no other entries it spawns 100% (since it has 0.01 of 0.01 total chance to spawn). What I generally do is set the total of a list to 100 so each every entry is an actual percentage chance. Then I know if I give the animalStag prob="1" it has 1% chance to appear in the world.
The invisibleAnimal is a hack, I think I invented it for A15 and then Gazz started using it for A16. It is basically an entity that ceases to exist on spawn, which means it thins out the spawning of the world (I will get to that in spawning.xml). But you can use it reduce animals or zombie spawns in the world, basically making the chance something appears less than 100, as there can be no empty groups as you can have in loot.xml
The order of the list has no effect as far as I can tell, the probability is what matters. Some entries have no probablity set, I think in this case you can assume it is 1, but I generally set them for everything, even if they are all 1.
--- Gamestages.xml ---
This file has replaced most horde spawning since A15, leaving many legacy entries in Spawning.xml redundant. It also controls the sleeper spawning. Here you can set the blood moon hordes, wandering hordes, scout hordes and sleepers. World spawns and scout spawns are still done in Spawning.xml. This may seem like a very complex file at first, but its mostly because of how the sleeper and blood moon hordes are setup for vanilla. I use a much cleaner setup myself making the file a lot more readable.
--- Spawning.xml ---
This file used to control all spawning, but now only does world and scout spawning. All other entries are legacy and have NO effect on the game anymore (trust me I tried).
World spawns work a bit differently from the others and generally are set on a really low number of 1 or 2 and a reset time of 4 ingame days. Do not let this low number fool you, the 1 is per spawn point and there can be quite a few spawn points. And as of A16 the spawn points do not spawn zombies instantly but they build up. Setting it to 10 means you will see only a few zeds at first but pretty quickly you will be at maximum spawns. This is also where the invisibleAnimal comes in, even a setting of 1 generates a lot of animals, and thus their numbers can be thinned down with this. In my setup I coupled this with daily respawning rather than every 4 days, since any invisible animal spawn will count as a dead animal and thus not spawn back later, but rather 4 days later. This is why animals die out after day 1 in the same area and randomly reappear a few days later.
I do not know if there is a book on this, but I learned most of this from modding, I think I have been tweaking hordes since A12, so if you have more questions just ask.