An opinion based answer, but it seems that injection through the constructor is best for the following reasons.
- You can perform a null constructor check, which can lead to incorrect error handling elsewhere in your class.
- You can more easily inject mocks into your class for testing.
- You cannot forget to indicate the dependency.
- This is not like magic.