To answer your question "what does a FXMLLoader do exactly when building a controller?":
first it will try to get a controller instance:
- if there is already a controller instance set on the FXMLLoader, it will use this instance.
- if there is no controller factory set on the FXMLLoader, it tries to call a zero-argument-constructor of the class per reflection. If this fails, an InstantiationException is thrown.
- if there is a controller factory set, it will call this factory to create a new controller instance.
after getting the controller instance, it will do the following with it:
- if this class implements Initializable, it calls public void initialize(URL url, ResourceBundle resourceBundle). If not, it looks if there is a method called initialize with zero arguments and calls it via reflection. If not, it does nothing.