You config class will not be used as is. Spring will wrap your config into so called proxy-class. This proxy class will intercept all invocations of methods of your original config class, which marked with @Bean annotation. Lets consider code of your configuration:
@Configuration public class ExampleConfiguration { @Bean public IFirstService firstService() { return new FirstServiceImpl(); } @Bean public ISecondService secondService() { return new SecondServiceImpl( firstService() //actually here is will be invoked method of proxy class ); } } Here is firstService() annotated with @Bean. So, because your config class wrapped into proxy, when you call firstService(), it will invoke method of proxy, but not method of original config class.
Simplified logic of proxy class looks as follows. When proxy class intercepts invocations of method, it checks (in case of singletone): is there already created instance of bean. If bean exists, this bean will be returned. If bean does not exists, new instance will be created by invocation of method of original config class.
This means, that each call to firstService() will not instantiates a new IFirstService instance. It will be created just on first call, and return thissame instance forwill be returned all subsequent calls.