The force of a spring, F, is F = k(x-d). k is the "rigidness", or spring contant. Because its multiplying the (x-d) term, the higher k is, the larger the spring force is going to be. x is the equilibrium point in the spring, or the default length that the spring always wants to return to, and d is the current length. So if k = 1, and x is 5, but d is 10, then
1(5-10) = 1(-5) = -5 = Fs.
There is a -5 Newton force acting on both bodies attached to the ends of the spring. Technically, it should be 5/2, because the force in the spring is being split between two bodies, but I dont really care, because it doesnt totally matter.
So when the sprint.update() method is called, Fs is calculated, and then applied to each body attached to the spring.
Next, when the body.update() method is called, it looks at the sum of all forces (which is most cases is just the spring force), and then using F = ma, gets an acceleration, which then steps down to a new velocity, and from there a new position Vector.
Other bodies can hit and smash into the bodies attached to the spring, and it will respond correctly. I have it set currently so that the bodies on a chain of springs wont collide with eachother, it just makes it less prone to crashes.
The other thing about the strength of the spring is the friction force on the bodies on either ends of the spring. If there is no friction force, then the spring will continue to move forever. When a friction force is added in, which adds itself into the sum of forces, and opposes the directino of velocity with a dependences on the magnitude of the velocity, that also determines how "strong" the spring is. If there is a high friction force, then it is "stronger"