I am studying Spring framework and I saw some thing that I couldn't explain what happens actually. suppose we have this simple Service class:
@Service
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RandomNumberGenerator {
double number;
public RandomNumberGenerator() {
System.out.println("Constructor is called!");
number = Math.random();
}
public double getNumber() {
return number;
}
}
and the following controller that uses above service:
@RestController
public class NumberController {
@Autowired
RandomNumberGenerator numberGenerator;
@GetMapping(path = "/number")
public double getNumber(){
System.out.println(System.identityHashCode(numberGenerator));
return numberGenerator.getNumber();
}
}
I postulated that with every request a new RandomNumberGenerator numberGenerator
instance will be created and so I should have different numbers printed in the System.out.println(System.identityHashCode(numberGenerator));
but strangely I got the same number with every request but I can see with every request constructor of the RandomNumberGenerator
is called!
for example you can see my console output:
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
Constructor is called!
257434344
my question is why I get the same number even though constructor is called? isn't System.out.println(System.identityHashCode(numberGenerator))
should returns different integers?