
Originally Posted by
jladd
Id be interested in any links you could provide that detail the Principles of Object Orientation and include a mention of dependency inject or inversion of control. There is dependency inversion but im not sure its the same thing especially when you have to break other principles to do it.
Dependency injection, IoC and Depenency inversion are all variations of the same concept; classes are *given* their dependencies, they don't find them themselves.

Originally Posted by
jladd
1. A principle of OO is encapsulation / data hiding and not exposing the implementation details of a Class. However, Spring needs public access to this information in order to do its 'thing'.
Not true
Classes can be wired up using constructor arguments just as easily as parameters:
Code:
<bean id="myBean" class="...."
<constructor-arg>
<bean class="some.collaborator.impl"/>
</constructor-arg>
<constructor-arg ref="someOtherCollaborator"/>
</bean>

Originally Posted by
jladd
2. The Dependency Inversion Principle: "Depemd Upon abstractions. Do not depend upon concretions. Which is also broken by Spring as again it requires concrete implementations and doesnt work through abstractfactories.
Not true again
If I have a class which requires a collaborator to work then the class would expect the interface. Of course at run time it must be provided with an implementation, but it only expects the interface:
Code:
public interface MyDAO {
void doSomething();
}
public class MyDAOImpl implements MyDAO {
public final void doSomething() {
...
}
}
public class MyClass {
private final MyDAO dao;
public MyClass(final MyDAO myDAO) {
this.dao = myDAO;
}
void doMyMethod() {
myDAO.doSomething();
}
}
and
Code:
<bean id="myDAO" class="MyDAOImpl"/>
<bean id=myClass" class="myClass">
<constructor-arg ref="myDAO"/>
</bean>
Note; no setters 

Originally Posted by
jladd
3. Not an OO principle but a Joshua Block one:- How do you use spring and ensure a class is immutable ?
See the above.

Originally Posted by
jladd
Maybe there are ways around these and the other principles broken by Spring but im not aware of them.
I still don't see which principles Spring breaks. To my mind, Spring actively encourages good practices 
It is true that most of Spring utility classes prefer setters, but that is an old convention, and isn't enforced. I simply workaround it by passing all required collaborators via constructor and calling setters on the utility class.
HTH.