Inversion of Control is a principle which recommends moving unwanted responsibilities out of a class and letting the class focus on core responsibilities, hence providing loose coupling.
There are two basic ways in Java to provide IOC- Dependency Injection and Dependency lookup.
As the name suggest, Dependency Injection is where the dependency is injected from outside the class, and class is not worried about details – http://kamalmeet.com/coding/more-on-dependency-injection/
Dependency lookup is where class itself looks up for dependency and chooses appropriate implementation. Use of JNDI lookup for proper bean of datasource is a good example.
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup(“jndiName”);